有什么区别?
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 ;
}
何时使用?
答案 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()
但是,您不能在集合中放置任何内容,因为您不知道集合实际应该保留的类型。