我希望了解这个概念:
T
object-通用,将被擦除为实际类型。?
对象-将被擦除成什么?Object
目的;之间有什么区别T
,?
和Object
?
我可以很容易地理解#1,但是呢:
Object var;
? var;
两者有什么区别?我读到我不能?
像T
其他变量一样显式地使用变量,它?
与对象而不是类型有关。
但是实际原因是什么?为什么不能只写一个List
对象(List<Object>
)而不是List
通配符(List<?>
)?我不知道这两种情况下的对象类型。
另外,我想知道擦除的目的是?
什么?
我将列出T
和之间的主要区别?
:
基本: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
您可以分别在此处和此处阅读。
问题内容: 为什么以下代码无法编译? 错误是 java:不兼容的类型:无法转换为 但我不明白为什么不捕获通配符。 问题答案: 这里的子类型关系为: (我在回答“无法从转换List<List>为List<List<?>>”中解释了这一点。) 因此,基本上它不会编译,因为它是横向转换。 如果可能的话,您可以执行我在那边描述的转换: 如果您无法进行转换,则可能只需要处理raw bound即可。主要由于警
本文向大家介绍Java泛型类型通配符和C#对比分析,包括了Java泛型类型通配符和C#对比分析的使用技巧和注意事项,需要的朋友参考一下 c#的泛型没有类型通配符,原因是.net的泛型是CLR支持的泛型,而Java的JVM并不支持泛型,只是语法糖,在编译器编译的时候都转换成object类型 类型通配符在java中表示的是泛型类型的父类 编译上面的程序,test(strList) 处将发生编译错误,意
问题内容: 在Java中,序列化对象非常容易。在C 中 ,只要对象像C结构一样就安全(?)(无多态性)。在C 中, 如果编译器能够生成默认的(琐碎的)复制构造函数,那么为什么它不能生成用于自动序列化的代码? 在Java中,只能从ctor访问静态函数和数据成员。 在C ++中,我可以愉快地使用ctor中的非静态成员和函数。 在Java中,我可以在类中内联初始化数据成员。在C ++中,这是一个编译错误
上限通配符下限通配符 有人能帮我理解一下吗?
问题内容: 我对Java中的通用通配符有两个疑问: 和之间有什么区别? 什么是有界通配符,什么是无界通配符? 问题答案: 在你的第一个问题中,并且是有界通配符的示例。无限制的通配符看起来像,基本上就是<? extends Object>。宽松地表示泛型可以是任何类型。有界通配符(或)通过说它必须扩展特定类型(称为上限)或必须是特定类型的祖先(称为下限)来对类型进行限制。
所以我在阅读泛型以重新熟悉这些概念,尤其是在涉及通配符的地方,因为我很少使用或遇到通配符。从我的阅读中,我不明白他们为什么使用通配符。下面是我经常遇到的一个例子。 你为什么不这样写: oracle网站上的另一个示例: 为什么这不是写成 我错过什么了吗?