Java 为什么不能创建类型参数的实例?
在Java中,创建Java 为什么不能创建类型参数的实例?,java,generics,Java,Generics,在Java中,创建类型参数的实例是非法的,因此以下代码不起作用: class Gen<T> { T ob; Gen() { ob = new T(); // Illegal!!! } } 因为: 在编译Java代码时,所有泛型类型信息都是 删除(删除)。这意味着用其类型参数替换类型参数 绑定类型,如果未指定显式绑定,则为对象 那么为什么实例化类型参数是非法的呢?很简单:因为T可以是任何东西 假设您有一个Gen。惊奇:Integer没有默认构造
类型
参数的实例是非法的,因此以下代码不起作用:
class Gen<T> {
T ob;
Gen() {
ob = new T(); // Illegal!!!
}
}
因为:
在编译Java代码时,所有泛型类型信息都是
删除(删除)。这意味着用其类型参数替换类型参数
绑定类型,如果未指定显式绑定,则为对象
那么为什么实例化
类型参数是非法的呢?很简单:因为T
可以是任何东西
假设您有一个Gen
。惊奇:Integer没有默认构造函数。那么你打算怎么做呢
编译器无法知道作为t
输入的东西是否有默认构造函数
java.lang.Object
显然有这样一个构造函数。当类型在运行时未知时,它是非法的。这是由于类型擦除
但是,如果您通过传递类型的类来为方法或构造函数提供有关类型的信息,那么您可以使用反射实例化该类型的对象,只要存在合适的构造函数
例如,这是可能的:
import javax.swing.*;
public class Gen<T> {
T ob;
Gen(Class<T> tClass) throws IllegalAccessException, InstantiationException {
ob = tClass.newInstance(); // legal if class has default constructor!!!
}
public T getOb() {
return ob;
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
Gen<JFrame> genFrame = new Gen<>(JFrame.class);
if((genFrame.getOb() == null)) {
throw new IllegalStateException();
}
Gen<JPanel> genPanel = new Gen<>(JPanel.class);
if(genPanel.getOb() == null) {
throw new IllegalStateException();
}
}
}
import javax.swing.*;
公共类发电机{
T-ob;
Gen(类tClass)抛出IllegaAccessException、InstanceionException{
ob=tClass.newInstance();//如果类有默认构造函数,则合法!!!
}
公共T getOb(){
返回ob;
}
publicstaticvoidmain(字符串[]args)抛出instanceionException、IllegalAccessException{
Gen-genFrame=new-Gen(JFrame.class);
if((genFrame.getOb()==null)){
抛出新的非法状态异常();
}
Gen genPanel=新的Gen(JPanel.class);
if(genPanel.getOb()==null){
抛出新的非法状态异常();
}
}
}
T如果T
是一个接口还是一个抽象类呢?@Jens它基本上不会以同样的方式工作吗?因为在这种情况下,返回类型
和参数
将被删除。您不能实例化接口或摘要class@GhostCat我一理解你的答案就会接受,因为等待时间有限。是的,我现在明白了。每个Java类
都不会为它们定义默认构造函数。谢谢你的澄清!不仅仅是一般没有默认构造函数:而是要在编译时选择要调用的构造函数,这要求您知道它将在编译时调用哪个类。@AndyTurner和泛型直到运行时才知道这一点,这是有意义的。@AbhishekKeshri否:由于类型擦除,在代码中的这一点上,类型永远不知道。
import javax.swing.*;
public class Gen<T> {
T ob;
Gen(Class<T> tClass) throws IllegalAccessException, InstantiationException {
ob = tClass.newInstance(); // legal if class has default constructor!!!
}
public T getOb() {
return ob;
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
Gen<JFrame> genFrame = new Gen<>(JFrame.class);
if((genFrame.getOb() == null)) {
throw new IllegalStateException();
}
Gen<JPanel> genPanel = new Gen<>(JPanel.class);
if(genPanel.getOb() == null) {
throw new IllegalStateException();
}
}
}