0

有什么区别?

public class MyClass<? extends MySuperClass> {

     private T data ;
     private MyClass<? extends MySuperClass> parent ;

}

public class MyClass<T extends MySuperClass> {

     private T data ;
     // the below line - no compilation errors
     private MyClass<? extends MySuperClass> parent ;
     // the below line - compilation errors 
     private MyCLass<T extends MySuperClass> child ;


}

什么时候用什么?

4

1 回答 1

1

<T>, <T>, 和<?>完全不同。

  • class X<T>声明一个泛型类,其类型参数(占位符)名为T. 在该类中,T是一个有效类型。

  • X<T> something是变量或字段声明。它声明一个类型为泛型的变量,并指定泛型参数的值。

  • X<?> something也是一个变量或字段声明。它声明了一个类型为泛型的变量,但没有指定泛型参数的值。


创建泛型类时,您可以选择向泛型参数添加约束,指定当人们声明该类的实例(变量)时允许的类型。

因此,class X<T extends SomeClass>创建了一个具有不太灵活的类型参数的泛型类。


当您使用泛型类(例如,private Collection<String> myStrings)时,您显然不能对泛型参数的值指定约束(因为您已经指定了实际值)。

因此,private Collection<String extends Comparable> myStrings没有任何意义。


当您使用带有通配符(或未绑定)参数(例如,private Collection<?> myThingies)的泛型类时,您可以选择对可能的参数指定约束。这允许您假设有关泛型参数的(未知)值的事情。

因此,private Collection<? extends Runnable> myRunners 是一些未知类型的集合,可保证该类型实现Runnable. 因此,您可以调用.run()集合中的事物。
但是,您不能在集合中添加任何内容,因为您不知道集合实际上应该包含什么类型。

于 2013-01-01T04:24:38.043 回答