Java 尽管SortedSet是一个接口而不是一个类,为什么向SortedSet添加元素是允许的
有人能解释一下,尽管这是一个接口而不是一个具体的类,但为什么这段代码编译和运行良好:Java 尽管SortedSet是一个接口而不是一个类,为什么向SortedSet添加元素是允许的,java,interface,sortedset,Java,Interface,Sortedset,有人能解释一下,尽管这是一个接口而不是一个具体的类,但为什么这段代码编译和运行良好: public static void main(String[] args) { Integer[] nums = {4, 7, 8, 14, 45, 33}; List<Integer> numList = Arrays.asList(nums); TreeSet<Integer> numSet = new TreeSet<Integer>();
public static void main(String[] args) {
Integer[] nums = {4, 7, 8, 14, 45, 33};
List<Integer> numList = Arrays.asList(nums);
TreeSet<Integer> numSet = new TreeSet<Integer>();
numSet.addAll(numList);
SortedSet<Integer> sSet = numSet.subSet(5, 20);
sSet.add(17);
System.out.println(sSet);
}
但是,如果我尝试以下代码:
public static void main(String[] args) {
Integer[] nums = {4, 7, 8, 14, 45, 33};
List<Integer> numList = Arrays.asList(nums);
numList.add(56);
System.out.println(numList);
}
publicstaticvoidmain(字符串[]args){
整数[]nums={4,7,8,14,45,33};
List numList=Arrays.asList(nums);
numList.add(56);
System.out.println(numList);
}
它抛出一个
不支持操作异常
。我认为,这是因为List是一个接口,不能作为一个具体的类来处理。关于分类数据集,什么是正确的 SortedSet是接口而不是类
只能从非抽象类实例化
列表也是一个接口。
但是,根据列表的文档,“添加”方法是可选的,这意味着不支持任何保证
我认为,可选的方法与接口的思想和契约相矛盾。
最好是有一个NonModifyableList(不带add)和一个ModifyableList(带add)。
当前糟糕的选择可能是历史和不想破坏旧代码的结果。SortedSet是一个接口而不是一个类 只能从非抽象类实例化 列表也是一个接口。 但是,根据列表的文档,“添加”方法是可选的,这意味着不支持任何保证 我认为,可选的方法与接口的思想和契约相矛盾。 最好是有一个NonModifyableList(不带add)和一个ModifyableList(带add)。
当前糟糕的选择可能是历史和不想破坏旧代码的结果。SortedSet是一个接口。这意味着您可以对实现此接口的类进行引用,但不能创建没有实现的类实例
在Arrays.asList()的情况下,它返回一个封装原始数组的类。无法添加到原始数组,因此不支持添加。例如,如果您使用set,您将更改原始阵列。SortedSet是一个接口。这意味着您可以对实现此接口的类进行引用,但不能创建没有实现的类实例
List<Integer> numList = Arrays.asList(nums);
在Arrays.asList()的情况下,它返回一个封装原始数组的类。无法添加到原始数组,因此不支持添加。例如,如果使用set,则将更改原始数组。List numList=Arrays.asList(nums);
List<Integer> numList = Arrays.asList(nums);
Array.asList()
在列表界面中返回数组,但换行。因此,列表仍然由数组支持,并且数组的大小是固定的,您不能从数组中添加/删除元素。这就是为什么下一行将抛出异常UnsupportedOperationException
要了解更多详细信息,javaArrayList
仍然是一个落后的数组,但它有一些帮助方法,供您删除/添加元素(您可以通过wiki获取短语可调整大小的数组
了解更多详细信息
其次,SortedSet
是一个接口。接口类似于抽象类,可以引用实现/扩展其类的类,但它不是具体类,因此不能在这些类(接口或抽象类)上创建对象
我明白了,你问的两个问题,可能都与OOP中的多态性有关,我建议你也使用wiki这个短语
希望得到以下帮助:)列出numList=Arrays.asList(nums);
Array.asList()
在列表界面中返回数组,但换行。因此,列表仍然由数组支持,并且数组的大小是固定的,您不能从数组中添加/删除元素。这就是为什么下一行将抛出异常UnsupportedOperationException
要了解更多详细信息,javaArrayList
仍然是一个落后的数组,但它有一些帮助方法,供您删除/添加元素(您可以通过wiki获取短语可调整大小的数组
了解更多详细信息
其次,SortedSet
是一个接口。接口类似于抽象类,可以引用实现/扩展其类的类,但它不是具体类,因此不能在这些类(接口或抽象类)上创建对象
我明白了,你问的两个问题,可能都与OOP中的多态性有关,我建议你也使用wiki这个短语
希望得到以下帮助:)如果我理解正确,您会问为什么可以成功地将对象引用为SortedSet(或任何接口类型)。当变量的类型是接口或抽象类时,这意味着该变量必须包含继承该变量类型的对象(或空对象) 虽然每个对象的实际类型都必须是一个具体的类,但是
sSet
变量仅用于保存继承(实现)SortedSet的某个类的实例
对于
TreeSet.subSet
方法,它返回一个类型为内部定义的具体类的对象,该类实现了SortedSet。如果我理解正确,您会问为什么可以成功地将对象引用为SortedSet(或任何接口类型)。当变量的类型是接口或抽象类时,这意味着该变量必须包含继承该变量类型的对象(或空对象)
虽然每个对象的实际类型都必须是一个具体的类,但是sSet
变量仅用于保存继承(实现)SortedSet的某个类的实例
对于TreeSet.subSet
方法,它返回一个类型为内部定义的具体类的对象,该类实现了SortedSet。的可能重复