【问题标题】:Possible types of elements for generic collections通用集合的可能元素类型
【发布时间】:2013-07-30 11:01:33
【问题描述】:
List<? super MyClass> parentsOfMyclass
List<? extends MyClass> childsOfMyclassFirst
List<T extends MyClass> childsOfMyclassSecond

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

【问题讨论】:

    标签: java generics collections


    【解决方案1】:

    List&lt;? super MyClass&gt; - 包含MyClass 的超类,这意味着您只能将MyClass 和它的超类放在这里。

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

    List&lt;T extends MyClass&gt; - 包含T,即MyClass 的子类。只能添加T 及其子类。

    【讨论】:

      【解决方案2】:

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

      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
      }
      

      【讨论】:

        【解决方案3】:

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

        第三种情况的正确语法是List&lt;T&gt; listT extends MyClass 应该在类声明中。

        【讨论】:

          猜你喜欢
          • 2017-05-31
          • 2016-11-03
          • 2021-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-26
          • 2015-11-30
          • 1970-01-01
          相关资源
          最近更新 更多