获取与泛型类型实例化对应的类实例



我有以下类型:

public class GenericClass<T> {
    public GenericClass(Class<T> cls) {}
}

但是,当 T 本身是一个泛型类时,我似乎不能调用它:

GenericClass<List<String>> g = new GenericClass<>(???);

使用 List.class 无法编译,List<String>.class语法无效。如何获取要传递给构造函数的Class<List<String>>实例?

这是一个更简单的解决方案......它完全隐藏了丑陋。这里的方法是隐式绑定结果类型,并将其与传入的原始类分开。

public class GenericClass<T> {
    public GenericClass(Class<T> cls) {}
    // static constructor;
    //    - hides unchecked ugliness, & implicitly binds 'nicely typed' to result.
    //
    public static <T>  GenericClass<T> create (Class<? super T> clazz) {
        // ugly cast is hidden in here;  no type checking.
        Class<T> clazz_ = (Class<T>)(Class) clazz;
        return new GenericClass( clazz_);
    }
}

用法:

GenericClass<List<String>> g = GenericClass.create( List.class);

我现在已经将"传入类"限制为? super T,但是 - 如果这太严格 - 您可以放宽限制并使参数Class<?> clazz

该解决方案已在我的IDE中进行了测试(至少很快),并且似乎运行良好。我不确定,从长远来看,这是否是解决你遇到的任何设计问题的最佳方法——但它绝对是解决你眼前问题的最整洁的方法。

怎么样

GenericClass<List<String>> g =
    new GenericClass<>((Class<List<String>>)(Class<?>)ArrayList.class);

您也可以尝试按如下方式声明构造函数

public <E extends T> GenericClass(Class<E> cls)

然后,您可以通过构造函数传递 List.class 和 List 的任何子项。

最新更新