0

我有我的通用接口:

public interface myGenericInterface<T> {...}

我有一个这样检索的类:

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

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

myGenericInterface<myClass> mySubType ...

它当然行不通。有没有办法做这样的事情?

更新:

好吧,由于泛型与编译时相关,我猜它不适用于反射样式代码。所以不会有什么好处。

4

2 回答 2

2

泛型是一个编译时特性,有助于避免编程错误,所以你试图做的事情没有意义,对不起。

于 2012-08-31T10:34:35.920 回答
1

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

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 对象不携带泛型信息 - 因为泛型信息仅用于编译时而不是运行时。

于 2012-08-31T11:49:26.253 回答