3
List<? super MyClass> parentsOfMyclass
List<? extends MyClass> childsOfMyclassFirst
List<T extends MyClass> childsOfMyclassSecond

请解释一下在这些集合中添加哪些类型有效?我可以将实例添加MyClass到所有这些集合中吗?

4

3 回答 3

3

List<? super MyClass>- 包含的东西是 的超类MyClass,这意味着你可以只把MyClass它的超类放在这里。

List<? extends MyClass>- 包含扩展MyClass的内容,这意味着您不能在此处添加任何内容(因为您不知道确切使用了哪个子类)。尽管您可以肯定地说,这些项目是MyClass(或子类)。

List<T extends MyClass>- 包含T,即 的子类MyClass。只能添加T它的子类。

于 2013-07-30T11:07:30.197 回答
0

你实际上不能像这样使用最后一个选项。它可以在类声明中使用,但不能在变量声明中使用。

static class MyClass {}

static class My2ndClass extends MyClass {}

static class ListExt<T extends MyClass> {}


public static void main(String[] args) {
    List<? super MyClass> parentsOfMyclass;
    List<? extends MyClass> childsOfMyclassFirst;
    List<T extends MyClass> childsOfMyclassSecond; //error

    ListExt<? extends MyClass> extList;


    childsOfMyclassFirst.add(new MyClass()); //error 
    parentsOfMyclass.add(new MyClass());
    extList.add(new MyClass()); // error
}
于 2013-07-30T11:22:53.350 回答
-1

您只能在第一种情况下(使用 super)添加 MyClass 的实例。? super MyClass使列表成为消费者,它即可以接收 MyClass 类型的对象。在第二种情况下,列表不能接收任何东西,它是一个生产者,一个只读列表。在第三种情况下,如果您之前进行了向下转换,您可以添加 MyClass 的子类型:.add((T)object);并且它当然不会引发异常。

第三种情况的正确语法应该是List<T> list并且T extends MyClass应该在类声明中。

于 2013-07-30T11:07:39.660 回答