您能帮我理解这里的通用概念吗?
// Can't create an instance of T.
class Gen<T> {
T ob;
Gen() {
ob = new T(); // Illegal!!!
}
public static void main() {
Gen<Integer> genobj = new Gen<Integer>(); //Error
}
}
当你的Java代码被编译时,所有泛型类型
信息被删除(擦除)。这意味着用它们的绑定替换类型参数
类型,如果没有指定显式绑定,则为 Object,然后应用适当的
强制转换(由类型参数确定)以保持与类型的类型兼容性
由类型参数指定。编译器还强制执行此类型兼容性。
我的问题:-为什么java编译器在这里抛出错误?
因为编译后.
Thanks
这里有几种方法可以解决:
从逻辑观点来看:
甚至不能保证无论模板参数T
您使用有一个默认构造函数。这显然提出了如何处理默认构造函数缺失的问题。可能的解决方案是产生运行时错误、编译时错误或禁止任何T
它不提供默认构造函数。后者显然会破坏模板定义,这允许any T
。运行时错误会使事情变得相当复杂,并产生与上面提到的相同的问题。仍然首先阻止这种行为并抛出编译时错误。
从内部来看:
假设我们可以使用提供的代码。那么它会如何运作呢?由于擦除,new T()
会产生一个Object
。但如果T
is Integer
?好吧,我们完蛋了。一个Object
不是一个Integer
,所以我们会得到一个简单的类转换异常。
总而言之:从实际的 POV 来看,允许上述编译是行不通的,而且还会破坏 java 中泛型的当前定义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)