Java Generics - 何时使用“T”和“?”

时间:2013-01-01 04:12:53

标签: java generics

有什么区别?

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 ;


}

何时使用?

1 个答案:

答案 0 :(得分: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() 但是,您不能在集合中放置任何内容,因为您不知道集合实际应该保留的类型。