我将列出
T和之间的主要区别
?:
基本:
T
是类型参数,?
是通配符。含义:
T
在定义泛型类时用作类型参数。T
实例化泛型类时,它将被具体类型代替。另一方面,?
在要引用 未知 类型参数时使用。定义的地方:您需要
T
在类或方法的顶部声明,如果您定义了通用方法。您可以?
在任何地方 使用。- 映射:的每次使用
T
都映射到相同的类型(在同一类中)。的每次使用?
都可以映射为其他类型。 - 对象实例化:您可以使用通用参数创建对象,
T
例如new ArrayList<T>()
。您不能实例化对象,而只能实例化带有的 指针?
。 集合更新:您可以将对象添加到类型的集合中
T
。您不能将对象添加到类型的集合中?
(因为您不知道其类型)。类型擦除:对于泛型,类型擦除适用于泛型的 使用 。使用泛型时,它们将转换为编译时检查和执行时强制转换。因此,例如,如果您具有以下代码:
List<String> myList = new ArrayList<String>();
然后希望通过执行以下操作将代码添加到列表中myList.add("Hello World");,然后get
再添加到刚刚添加的项目中,String myString = myList.get(0);
则编译器会将代码编译为List myList = new ArrayList();
和String myString = (String) myList.get(0);
(由于add
明显的原因,代码保持不变) )。
因此,基本上,在执行时 没有办法 找出T
本质上是String
用于列表对象的信息(信息消失了)。
现在,对于通配符而言,情况有所不同。通配符(
?)替换为
Object(因为它是 无界的 )。这不是很有用。在构建时,编译器将检查您是否 仅
调用
Object的行为。如果您有类似的内容
? extendsFoo,则会将
?其替换为绑定
Foo(在构建时,编译器将检查您是否仅将
Foo其子类型(或继承自的类型
Foo)作为参数传递。
对于
?与
Object&
T和之间的差异,
Object您可以分别在此处和此处阅读。



