Javagenerics,对象和通配符的差异和说明
我希望理解这个概念:
-
T
对象 – 通用,将被删除为实际类型。 -
?
对象 – 会被抹去什么? -
Object
对象;
T
之间有什么区别?
和Object
?
我很容易理解#1,但是怎么样:
Object var; ? var;
两者有什么区别? 我看过我不能用?
明确地,像T
或任何其他变量,那?
与对象有关,而与类型无关。
但实际原因是什么? 为什么我不能只编写一个对象List
( List
)而不是一个通配符List
( List
)? 因为我不知道两种情况下的对象类型。
另外,我想知道什么是擦除?
?
我将列出T
和?
之间的主要区别?
:
-
基本:
T
是一个类型参数和?
是一个通配符。 -
含义:
T
在定义generics类时用作类型参数。 在实例化generics类时,T
将被具体类型替换。 另一方面,我们使用?
当我们想要引用一个未知类型的参数时。 - 定义的位置:如果定义了generics方法,则需要在类的顶部声明
T
或方法。 你可以用?
到处都是 - 映射:
T
每次使用都映射到相同的类型(在同一个类中)。 每次使用?
可以映射到不同的类型。 - 对象实例化:您可以使用generics参数
T
创建对象,如new ArrayList
。 你不能实例化对象,但只能指针() ?
。 -
集合更新:您可以将对象添加到
T
类型的集合中。 你不能将对象添加到类型的集合?
(因为你不知道它的类型)。 -
类型擦除:使用generics,类型擦除适用于generics的使用 。 使用generics时,它们将转换为编译时检查和执行时转换。 因此,如果您有此代码,例如:
List
然后你希望添加到你的列表中,以便你做myList = new ArrayList (); myList.add("Hello World");
然后你想通过执行String myString = myList.get(0);
get
你刚添加的项目String myString = myList.get(0);
然后编译器会将你的代码编译为List myList = new ArrayList();
和String myString = (String) myList.get(0);
(由于显而易见的原因,add
保持不变)。
所以基本上,在执行时, 没有办法发现T
本质上是列表对象的String
(该信息消失了)。现在对于通配符来说,故事是不同的。 通配符(
?
)被Object
替换(因为它是无界的 )。 这不是很有用。 在构建时,编译器将检查您是否只调用Object
的行为。 如果你有类似的东西? extends Foo
? extends Foo
,那么?
被绑定的Foo
替换(在构建时,编译器将检查您是仅传递Foo
或其任何子类型(从Foo
inheritance的类型)作为参数)。
对于差异?
和Object
& T
和Object
你可以在这里和这里分别阅读。