Java Generics运行时实例化

时间:2012-08-31 10:02:35

标签: java generics reflection

我有我的通用界面:

public interface myGenericInterface<T> {...}

我有一个以这种方式检索的课程:

Class<?> myClass = Class.forName("myClassName");

我希望能够实例化这样的东西:

myGenericInterface<myClass> mySubType ...

当然没有用。有没有办法做这样的事情?

更新:

好吧,因为泛型与编译时相关,我想它不适用于反射样式代码。因此,没有任何好处可以产生。

2 个答案:

答案 0 :(得分:2)

泛型是一种编译时功能,有助于避免编程错误,因此您尝试做的事情毫无意义,抱歉。

答案 1 :(得分:1)

当您在类字段中使用泛型声明对象时,此类中的Field反射对象会保留声明的泛型类型。

static class ClassA {
    public List<String> field = new ArrayList<String>();
}

public static void main(String[] args) throws Exception {
    Field field = ClassA.class.getField("field");
    Class<?> genericType = getGenericType(field);
    System.out.println(genericType);
}

private static Class<?> getGenericType(Field field) {
    final Type type0 = field.getGenericType();
    if (type0 instanceof ParameterizedType) {
        final Type type = ((ParameterizedType) type0).getActualTypeArguments()[0];
        if (type instanceof Class<?>) {
            return (Class<?>) type;
        }
        // miss code for method arguments
    }
    return Object.class;
}

代码打印class java.lang.String并且在您的情况下可能很有用,但基本上原始的Class对象不带有泛型信息 - 因为泛型信息仅用于编译时而不是运行时。