Javagenerics,对象和通配符的差异和说明

我希望理解这个概念:

  1. T对象 – 通用,将被删除为实际类型。
  2. ? 对象 – 会被抹去什么?
  3. Object对象;

T之间有什么区别?Object

我很容易理解#1,但是怎么样:

 Object var; ? var; 

两者有什么区别? 我看过我不能用? 明确地,像T或任何其他变量,那? 与对象有关,而与类型无关。
但实际原因是什么? 为什么我不能只编写一个对象ListList )而不是一个通配符ListList )? 因为我不知道两种情况下的对象类型。
另外,我想知道什么是擦除?

我将列出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或其任何子类型(从Fooinheritance的类型)作为参数)。

对于差异?ObjectTObject你可以在这里和这里分别阅读。