如何将参数化类作为参数传递

Mon*_*son 15 java generics

我的目标是开发一个可以输出指定类对象的类.

public class GetMe<T> {
    public T get() {
        Object obj = generateObject();
        return (T) obj;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我知道由于擦除,这是不可能的.因此,我们可以传入一个类实例并使用它来进行转换.

public class GetMe<T> {
    public GetMe<T>(Class<T> clazz) {
        this.clazz = clazz;
    }

    public T get() {
        Object obj = generateObject();
        return clazz.cast(obj);
    }
}
Run Code Online (Sandbox Code Playgroud)

这很棒!只要该类没有参数化.如果是,那我就有问题了.

我不允许使用List<String>.class.如果我传入ParameterizedType(这本身很难生成),则没有cast方法可以使用.

有没有办法摆脱这个泥潭?

Mat*_*nry 5

我认为超级型令牌可以为您解决这个问题.


Wal*_*inz 2

问题List<String>是,由于擦除,它在运行时与任何其他List<?>. 解决这个问题最简单的方法是创建一个新的类或接口,其通用部分“固定”,例如

public interface StringList extends List<String> {
    /* nothing to see here */
}
Run Code Online (Sandbox Code Playgroud)

这样,您就拥有了一个类型标记(StringList.class对象),您可以在运行时传递它并准确指定您想要的内容,但在运行时不需要泛型。