通用集合的可能元素类型

时间:2013-07-30 11:01:34

标签: java generics collections

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

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

3 个答案:

答案 0 :(得分:3)

List<? super MyClass> - 包含MyClass的超类,这意味着您只能在此处放置MyClass及其超类。

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

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

答案 1 :(得分: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
}

答案 2 :(得分:-1)

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

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