未支持的操作

利用static(静态)数组Arrays.toList(),也许能将一个数组转换成List,如下所示:
 

//: Unsupported.java
// Sometimes methods defined in the Collection
// interfaces don't work!
package c08.newcollections;
import java.util.*;

public class Unsupported {
  private static String[] s = {
    "one", "two", "three", "four", "five",
    "six", "seven", "eight", "nine", "ten",
  };
  static List a = Arrays.toList(s);
  static List a2 = Arrays.toList(
    new String[] { s[3], s[4], s[5] });
  public static void main(String[] args) {
    Collection1.print(a); // Iteration
    System.out.println(
      "a.contains(" + s[0] + ") = " +
      a.contains(s[0]));
    System.out.println(
      "a.containsAll(a2) = " +
      a.containsAll(a2));
    System.out.println("a.isEmpty() = " +
      a.isEmpty());
    System.out.println(
      "a.indexOf(" + s[5] + ") = " +
      a.indexOf(s[5]));
    // Traverse backwards:
    ListIterator lit = a.listIterator(a.size());
    while(lit.hasPrevious())
      System.out.print(lit.previous());
    System.out.println();
    // Set the elements to different values:
    for(int i = 0; i < a.size(); i++)
      a.set(i, "47");
    Collection1.print(a);
    // Compiles, but won't run:
    lit.add("X"); // Unsupported operation
    a.clear(); // Unsupported
    a.add("eleven"); // Unsupported
    a.addAll(a2); // Unsupported
    a.retainAll(a2); // Unsupported
    a.remove(s[0]); // Unsupported
    a.removeAll(a2); // Unsupported
  }
} ///:~

从中可以看出,实际只实现了Collection和List接口的一部分。剩余的方法导致了不受欢迎的一种情况,名为UnsupportedOperationException。在下一章里,我们会讲述违例的详细情况,但在这里有必要进行一下简单说明。这里的关键在于“集合接口”,以及新集合库内的另一些接口,它们都包含了“可选的”方法。在实现那些接口的集合类中,或者提供、或者没有提供对那些方法的支持。若调用一个未获支持的方法,就会导致一个UnsupportedOperationException(操作未支持违例),这表明出现了一个编程错误。
大家或许会觉得奇怪,不是说“接口”和基础类最大的“卖点”就是它们许诺这些方法能产生一些有意义的行为吗?上述违例破坏了那个许诺——它调用的一部分方法不仅不能产生有意义的行为,而且还会中止程序的运行。在这些情况下,类型的所谓安全保证似乎显得一钱不值!但是,情况并没有想象的那么坏。通过Collection,List,Set或者Map,编译器仍然限制我们只能调用那个接口中的方法,所以它和Smalltalk还是存在一些区别的(在Smalltalk中,可为任何对象调用任何方法,而且只有在运行程序时才知道这些调用是否可行)。除此以外,以Collection作为自变量的大多数方法只能从那个集合中读取数据——Collection的所有“read”方法都不是可选的。
这样一来,系统就可避免在设计期间出现接口的冲突。而在集合库的其他设计方案中,最终经常都会得到数量过多的接口,用它们描述基本方案的每一种变化形式,所以学习和掌握显得非常困难。有些时候,甚至难于捕捉接口中的所有特殊情况,因为人们可能设计出任何新接口。但Java的“不支持的操作”方法却达到了新集合库的一个重要设计目标:易于学习和使用。但是,为了使这一方法真正有效,却需满足下述条件:
(1) UnsupportedOperationException必须属于一种“非常”事件。也就是说,对于大多数类来说,所有操作都应是可行的。只有在一些特殊情况下,一、两个操作才可能未获支持。新集合库满足了这一条件,因为绝大多数时候用到的类——ArrayList,LinkedList,HashList和HashMap,以及其他集合方案——都提供了对所有操作的支持。但是,如果想新建一个集合,同时不想为集合接口中的所有方法都提供有意义的定义,同时令其仍与现有库配合,这种设计方法也确实提供了一个“后门”可以利用。
(2) 若一个操作未获支持,那么UnsupportedOperationException(未支持的操作违例)极有可能在实现期间出现,则不是在产品已交付给客户以后才会出现。它毕竟指出的是一个编程错误——不正确地使用了一个类。这一点不能十分确定,通过也可以看出这种方案的“试验”特征——只有经过多次试验,才能找出最理想的工作方式。

在上面的例子中,Arrays.toList()产生了一个List(列表),该列表是由一个固定长度的数组后推出来的。因此唯一能够支持的就是那些不改变数组长度的操作。在另一方面,若请求一个新接口表达不同种类的行为(可能叫作“FixedSizeList”——固定长度列表),就有遭遇更大的复杂程度的危险。这样一来,以后试图使用库的时候,很快就会发现自己不知从何处下手。
对那些采用Collection,List,Set或者Map作为参数的方法,它们的文档应当指出哪些可选的方法是必须实现的。举个例子来说,排序要求实现set()和Iterator.set()方法,但不包括add()和remove()。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索接口
, 方法
, collection
, 支持
, Unsupported
一个
不支持尝试执行的操作、docker支持的操作系统、试图执行不支持的操作、mysql支持的操作系统、oracle支持的操作系统,以便于您获取更多的相关知识。

时间: 2024-12-04 03:46:02

未支持的操作的相关文章

Java容器——未获支持的操作

    先看一个例子: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import 

【ASP.NET Web API教程】2.1 创建支持CRUD操作的Web API

原文 [ASP.NET Web API教程]2.1 创建支持CRUD操作的Web API 2.1 Creating a Web API that Supports CRUD Operations2.1 创建支持CRUD操作的Web API By Mike Wasson | January 28, 2012作者:Mike Wasson | 日期:2012-1-28 本文引自:http://www.asp.net/web-api/overview/creating-web-apis/creating

C#支持输入输出操作的类型

Stream System.IO为我们提供了一个抽象类Stream,Stream类支持对字节的读写操作.在Stream类中包括了对异步操作的支持. 既然Stream是抽象类,所有其它流的类就都必须从Steam类中继承.Stream类及其子类共同构成了一个数据源和数据存储的视图,从而封装了操作系统和底层存储的各个细节,使程序员把注意力集中到程序的应用逻辑上来. 流包含以下基本操作: 读操作(Reading).即读出流中的数据,把数据存放在另一种数据结构中,比如数组. 写操作(Writting).即

OSS不支持的操作

 如果试图以不支持的操作来访问某个资源,返回405 Method Not Allowed错误 请求示例: abc /BucketName HTTP/1.1 Host: storage.aliyun.com Date: date Authorization: signatureValue 返回消息头示例: x-oss-request-id: 2403382433A2EDA8 Allow: GET, DELETE, HEAD, PUT Content-Type: application/xml Tr

求助-arcgis new一个polygon 对象,当网页运行时错误,对象不支持此操作

问题描述 arcgis new一个polygon 对象,当网页运行时错误,对象不支持此操作 有部分省略"esri/geometry/Polygon", "esri/SpatialReference", ], function (FeatureLayer, BootstrapMap, ABCLayer, Map, HeatmapRenderer, Polygon, SpatialReference) { var map = BootstrapMap.create(&q

水晶报表错误“不支持的操作。无法在 C++ 堆栈中打开由 JRC 引擎处理的文档。”

问题描述 水晶报表错误"不支持的操作.无法在 C++ 堆栈中打开由 JRC 引擎处理的文档." 使用环境是 VS2012,项目属性WEB页签中,服务器使用的是"使用Visual Studio开发服务器",在aspx页面中点在浏览器中查看就会出现错误: 不支持的操作.无法在 C++ 堆栈中打开由 JRC 引擎处理的文档. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: S

js- 对象不支持此操作

问题描述 对象不支持此操作 解决方案 语法本身没问题,这段代码是不是写在js里面. 试试把星期日等换成英文.如果不报错,那就是你js文件报错的编码格式有问题,可以重新保存一下成和你开发环境一直的编码 解决方案二: 换一种写法吧,var weekDayLabels=["星期一","星期二".......];

对象-如何理解ArrayAdapter:支持泛型操作?

问题描述 如何理解ArrayAdapter:支持泛型操作? 还有其他对象或者类支持泛型操作吗?如何理解ArrayAdapter:支持泛型操作? 解决方案 ArrayAdapter 在实例化的时候要传入一个list集合,这个list集合中变可以放你想的泛型

JS未跨域操作iframe里的DOM_javascript技巧

这里简单说明两个方法,都是未跨域情况下在index.html内操作b.html内的 DOM. 如:index.html内引入iframe,在index内如何用JS操作iframe内的DOM元素? 先贴下index.html和iframe引入的a.html内容. index-> <div class="d1"> <iframe src="a.html" frameborder="0" name="one"