2

我有以下类型:

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

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

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

usingList.class不编译,并且List<String>.class是无效的语法。如何获取 a 的实例Class<List<String>>以传递给构造函数?

4

3 回答 3

2

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

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);

我现在已经限制了“传入的类”clazz ? super T,但是——如果这太严格了——你可以放宽边界并将参数设为Class<?> clazz.

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

于 2013-09-11T12:49:52.703 回答
1

怎么样

GenericClass<List<String>> g =
    new GenericClass<>((Class<List<String>>)(Class<?>)ArrayList.class);
于 2013-09-11T21:38:09.840 回答
0

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

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

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

于 2013-09-11T13:21:20.840 回答