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提到的那样