Java泛型,对象和通配符的差异和说明

ava*_*lon 5 java generics wildcard object type-erasure

我希望理解这个概念:

  1. T object - generic,将被删除为实际类型.
  2. ? 对象 - 会被抹去什么?
  3. Object 宾语;

之间有什么区别T,?Object

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

Object var;
? var;
Run Code Online (Sandbox Code Playgroud)

两者有什么区别?我已经读过,我不能?明确地使用,像T或任何其他变量,并且它?与对象有关,而不是类型.
但实际原因是什么?为什么我不能只写一个List对象(List<Object>)而不是List通配符(List<?>)?因为我不知道两种情况下的对象类型.
另外,我想知道什么是擦除?

Ido*_*dos 9

我将列出T和之间的主要区别?:

  • Basic: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行为.如果你有类似的东西? extends Foo,则将其?替换为其绑定Foo(在构建时,编译器将检查您是仅传递Foo或其任何子类型(继承自的类型Foo)作为参数).

对于?Object&之间的差异T,Object您可以分别在这里这里阅读.