Java 为什么不能创建类型参数的实例?

Java 为什么不能创建类型参数的实例?,java,generics,Java,Generics,在Java中,创建类型参数的实例是非法的,因此以下代码不起作用: class Gen<T> { T ob; Gen() { ob = new T(); // Illegal!!! } } 因为: 在编译Java代码时,所有泛型类型信息都是 删除(删除)。这意味着用其类型参数替换类型参数 绑定类型,如果未指定显式绑定,则为对象 那么为什么实例化类型参数是非法的呢?很简单:因为T可以是任何东西 假设您有一个Gen。惊奇:Integer没有默认构造

在Java中,创建
类型
参数的实例是非法的,因此以下代码不起作用:

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();
        }
    }
}