您能否帮助我在这里理解通用概念.
// Can't create an instance of T.
class Gen {
T ob;
Gen() {
ob = new T(); // Illegal!!!
}
public static void main() {
Gen genobj = new Gen(); //Error
}
}
编译Java代码时,所有通用类型
信息被删除(删除).这意味着用其绑定替换类型参数
类型,如果未指定显式绑定,则为Object,然后应用适当的
强制转换(由类型参数确定)以保持与类型的类型兼容性
由类型参数指定.编译器还强制执行此类型兼容性.
我的问题:-为什么Java编译器在这里抛出错误?
崩溃后厌恶.
谢谢
解决方法:
这里有几种方法可以解决:
从逻辑POV:
甚至不能保证您使用的任何模板参数T都有默认构造函数.显然,这带来了如何处理缺少默认构造函数的问题.可能的解决方案是产生运行时错误,编译时错误或禁止任何不提供默认构造函数的T.后者显然会破坏允许使用任何T的模板定义.运行时错误会使事情复杂得多,并产生与上述相同的问题.首先仍然要防止此行为,并抛出编译时错误.
从内部来看:
假设我们可以使用提供的代码.那怎么办?由于擦除,新的T()将产生一个Object.但是,如果T为整数怎么办?好吧,我们被搞砸了.对象不是整数,因此我们将获得一个普通的类转换异常.
因此,总而言之:从实用的POV开始,不允许上述内容进行编译,而且破坏了Java中泛型的当前定义.
标签:java
来源: https://codeday.me/bug/20191010/1886423.html