我发现了很多关于how克服这个限制,但没有说明为什么存在这个限制(除了this one https://stackoverflow.com/questions/75175/create-instance-of-generic-type-in-java,它只是提到它与类型擦除有关)。
那么为什么不能创建泛型类型的实例呢?
澄清一下,我的问题不是how可以办到。我知道这在 C# 中是可能的,那么为什么在 Java 中不行呢?我很好奇为什么 Java 人没有实现类似的机制?为什么要强迫 Java 开发人员使用可能导致运行时错误的尴尬解决方法?这样的机制有没有潜在的危险?
简短回答:Java是一个编译型编程语言 http://en.wikipedia.org/wiki/Compiled_language,这意味着您的字节码在运行时是恒定的。不可能生成字节码new E()
if E
未知。
解释: 通用信息是在运行时擦除 http://docs.oracle.com/javase/tutorial/java/generics/genTypes.html:
public class Container<E> {
private E item;
public E getItem() {return item;}
}
class BoxWithPresent extends Container<Present> {
}
class SimpleBox extends Container {
}
在字节码类中BoxWithPresent
包含字段item
类型的Present
,但是类SimpleBox
包含字段item
类型的Object
(因为类型E
未指定)。
现在编写抽象实例化方法:
public class Container<E> {
public <E> E createE() {
return new E(); // imagine if that was allowed
}
}
这里应该生成什么字节码?.class
文件现在在编译时生成,但我们不知道是什么E
type.
所以可以new T()
被替换为new Object()
?坏主意,班级BoxWithPresent
不会喜欢它,因为它期望这样E
is Present
.
可以换成class.newInstance()
?再说一遍,不,没有class
方法范围内的变量。
这就是为什么new E()
是不可能的。
但有一些解决方法可以通过class
作为参数,或提取通用信息 https://stackoverflow.com/a/75345/2513573.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)