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

2022-09-02 22:33:01

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

public class GetMe<T> {
    public T get() {
        Object obj = generateObject();
        return (T) obj;
    }
}

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

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

    public T get() {
        Object obj = generateObject();
        return clazz.cast(obj);
    }
}

这工作得很好!只要类未参数化。如果是这样,那么我就有问题了。

我不被允许使用.如果我传入一个参数化类型(它本身很难生成),则没有方法可以使用。List<String>.classcast

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


答案 1

我认为超级类型令牌可能会为您解决这个问题。


答案 2

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

public interface StringList extends List<String> {
    /* nothing to see here */
}

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


推荐