我的目标是开发一个可以输出指定类对象的类.
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方法可以使用.
有没有办法摆脱这个泥潭?
问题List<String>是,由于擦除,它在运行时与任何其他List<?>. 解决这个问题最简单的方法是创建一个新的类或接口,其通用部分“固定”,例如
public interface StringList extends List<String> {
/* nothing to see here */
}
Run Code Online (Sandbox Code Playgroud)
这样,您就拥有了一个类型标记(StringList.class对象),您可以在运行时传递它并准确指定您想要的内容,但在运行时不需要泛型。
| 归档时间: |
|
| 查看次数: |
6108 次 |
| 最近记录: |