繁体   English   中英

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

[英]Getting a Class instance corresponding to a generic type instantiation

我有以下类型:

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 现在是? 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的任何子级。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM