有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中捕获泛型类型

如果我有类似于:

class Test<T extends X> {
    public T test() {
        T t = /* ... */;
        return t;
    }
}

如何捕获T的类以便实例化它?是否有防止类型擦除的变通方法?我甚至不需要访问T的方法,X的方法就可以了,但我需要返回一个T


共 (3) 个答案

  1. # 1 楼答案

    您唯一能做的就是将T类作为额外参数传递给test()或在类Test中设置一个成员字段。您无法阻止类型擦除

    class Test<T extends X> {
        private Class<T> mClass;
        public Test(Class<T> c) {
            mClass = c;
        }
        public T test() {
            T t = mClass.newInstance();
            return t;
        }
    }
    

    或者,也可以将factory对象传递到相同的效果。当您需要使用除默认构造函数以外的其他方法时,这种方法非常有效

  2. # 2 楼答案

    将其定义为:

    class Test<T extends X>
    {
        public T test(Class<T> c)
        {
            T t = c.newInstance();
            return t;
        }
    }
    

    然后像这样使用它:

    Test<Foo> t = new Test<Foo>();
    t.test(Foo.class);
    
  3. # 3 楼答案

    您不能直接这样做,但是您可以添加一个t实现的接口来创建一个实例或一个t的数组