代码之家  ›  专栏  ›  技术社区  ›  Abhishek Keshri

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

  •  4
  • Abhishek Keshri  · 技术社区  · 7 年前

    在Java中,创建 type 参数非法,因此以下代码将不起作用:

    class Gen<T> {
        T ob;
        Gen() {
            ob = new T(); // Illegal!!!
        }
    }
    

    这背后的原因是:

    T在运行时不存在,那么编译器怎么知道呢 要创建的对象的类型。

    但我不明白的是 erasure 以下代码将转换为:

    class Gen {
        Object ob;
        Gen() {
            ob = new Object(); // Perfectly Fine!!!
        }
    }
    

    编译Java代码时,所有泛型类型信息都是 绑定类型,即 Object 如果未指定显式绑定。

    那么为什么要实例化 参数非法?

    2 回复  |  直到 7 年前
        1
  •  11
  •   Abhishek Keshri    7 年前

    很简单:因为 T 可能是任何东西。

    假设你有一个 Gen<Integer> . 惊喜:整数真的 有一个默认的构造函数。那你打算怎么办 new Integer() 然后呢?

    编译器无法 知道 对于作为 T型

    java.lang.Object 显然有这样一个构造器。

        2
  •  0
  •   gil.fernandes    7 年前

    但是,如果通过传递类型的类给方法或构造函数有关类型的信息,则可以使用反射实例化该类型的对象—只要有合适的构造函数即可。

    例如,这是可能的:

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