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

要了解更多详细信息,java
ArrayList
仍然是一个落后的数组,但它有一些帮助方法,供您删除/添加元素(您可以通过wiki获取短语
可调整大小的数组
了解更多详细信息

其次,
SortedSet
是一个接口。接口类似于抽象类,可以引用实现/扩展其类的类,但它不是具体类,因此不能在这些类(接口或抽象类)上创建对象

我明白了,你问的两个问题,可能都与OOP中的多态性有关,我建议你也使用wiki这个短语

希望得到以下帮助:)

列出numList=Arrays.asList(nums);
Array.asList()
在列表界面中返回数组,但换行。因此,列表仍然由数组支持,并且数组的大小是固定的,您不能从数组中添加/删除元素。这就是为什么下一行将抛出异常
UnsupportedOperationException

要了解更多详细信息,java
ArrayList
仍然是一个落后的数组,但它有一些帮助方法,供您删除/添加元素(您可以通过wiki获取短语
可调整大小的数组
了解更多详细信息

其次,
SortedSet
是一个接口。接口类似于抽象类,可以引用实现/扩展其类的类,但它不是具体类,因此不能在这些类(接口或抽象类)上创建对象

我明白了,你问的两个问题,可能都与OOP中的多态性有关,我建议你也使用wiki这个短语


希望得到以下帮助:)

如果我理解正确,您会问为什么可以成功地将对象引用为SortedSet(或任何接口类型)。当变量的类型是接口或抽象类时,这意味着该变量必须包含继承该变量类型的对象(或空对象)

虽然每个对象的实际类型都必须是一个具体的类,但是
sSet
变量仅用于保存继承(实现)SortedSet的某个类的实例


对于
TreeSet.subSet
方法,它返回一个类型为内部定义的具体类的对象,该类实现了SortedSet。

如果我理解正确,您会问为什么可以成功地将对象引用为SortedSet(或任何接口类型)。当变量的类型是接口或抽象类时,这意味着该变量必须包含继承该变量类型的对象(或空对象)

虽然每个对象的实际类型都必须是一个具体的类,但是
sSet
变量仅用于保存继承(实现)SortedSet的某个类的实例

对于
TreeSet.subSet
方法,它返回一个类型为内部定义的具体类的对象,该类实现了SortedSet。

的可能重复