Java泛型、对象和通配符的差异&;澄清

Java泛型、对象和通配符的差异&;澄清,java,object,generics,wildcard,type-erasure,Java,Object,Generics,Wildcard,Type Erasure,我希望了解这个概念: Tobject-generic将被擦除为实际类型 ?对象-将被擦除为什么 对象对象 T、?和对象之间有什么区别 我很容易理解#1,但是关于: Object var; ? var; 这两者的区别是什么?我已经读到我不能像t或任何其他变量那样明确地使用?,并且?与对象相关,而不是与类型相关。 但实际原因是什么?为什么我不能写一个对象的列表(列表),而不是一个通配符的列表(列表)?因为我不知道这两种情况下的对象类型。 此外,我想知道什么是??的擦除,我将列出T和?之间的主要区别

我希望了解这个概念:

  • T
    object-generic将被擦除为实际类型
  • 对象-将被擦除为什么
  • 对象
    对象
    T
    对象之间有什么区别

    我很容易理解#1,但是关于:

    Object var;
    ? var;
    
    这两者的区别是什么?我已经读到我不能像
    t
    或任何其他变量那样明确地使用
    ,并且
    与对象相关,而不是与类型相关。
    但实际原因是什么?为什么我不能写一个对象的
    列表(
    列表
    ),而不是一个通配符的
    列表(
    列表
    )?因为我不知道这两种情况下的对象类型。

    此外,我想知道什么是

    的擦除,我将列出
    T
    之间的主要区别:

    • 基本:
      T
      是一个类型参数,
      是一个通配符

    • 含义:
      T
      在定义泛型类时用作类型参数<当您实例化泛型类时,code>T
    将被具体类型替换。 另一方面,当我们想要引用未知类型的参数时,我们使用

  • 定义位置:如果定义泛型方法,则需要在类的顶部声明
    T
    ,或方法。您可以在任何地方使用
  • 映射:每次使用
    T
    都映射到同一类型(在同一类中)。
    的每次使用都可以映射到不同的类型
  • 对象实例化:可以使用通用参数
    T
    创建对象,如
    new ArrayList()
    。不能实例化对象,只能实例化带有
    的指针
  • 集合更新:您可以将对象添加到类型为
    T
    的集合中。无法将对象添加到类型为
    的集合中(因为您不知道其类型)

  • 类型擦除:对于泛型,类型擦除适用于泛型的使用。使用泛型时,它们会转换为编译时检查和执行时强制转换。例如,如果您有以下代码:
    List myList=new ArrayList()
    然后您希望添加到列表中,这样您就可以
    myList.add(“Hello World”)
    然后您希望通过执行
    String myString=myList.get(0)来
    获取刚刚添加的项
    然后编译器将编译您的代码到
    List myList=new ArrayList()
    String myString=(String)myList.get(0)(由于明显的原因,
    add
    保持不变)。
    因此,基本上,在执行时,无法确定列表对象的
    T
    本质上是
    String
    (该信息已消失)

    现在对于通配符,情况就不同了。通配符(
    )由
    对象替换(因为它是无界的)。这不是很有用。在构建时,编译器将检查您仅调用
    对象的行为。如果您有类似于
    ?扩展Foo
    ,然后将
    替换为其绑定的
    Foo
    (编译时,编译器将检查您是否仅将
    Foo
    或其任何子类型(从
    Foo
    继承的类型)作为参数传递)


  • 关于
    对象
    &
    T
    对象
    之间的差异,您可以分别阅读和。

    我先从。特别是查找“通配符捕获”和一些更好的链接,在这里提到类型擦除会很好,就像OP提到的那样