【发布时间】:2009-12-24 16:58:50
【问题描述】:
这是一个 Java 泛型模式:
public <T> T getResultData(Class<T> resultClass, other_args) {
...
return resultClass.cast(T-thing);
}
典型的调用如下所示:
DoubleBuffer buffer;
buffer = thing.getResultData(DoubleBuffer.class, args);
当所需的返回类型本身是通用的时,我一直无法弄清楚如何干净地使用此模式。为了“具体”,如果这样的函数想要返回 Map<String,String> 怎么办?因为你不能得到一个泛型的类对象,当然,唯一的选择是传递Map.class,然后你需要一个演员和一个@SuppressWarning。
一个最终的电话如下:
Map<String, String> returnedMap;
returnedMap = thing.getResultData(Map.class, some_other_args);
现在又回到了需要强制转换和抑制警告的状态。
我想人们可以从java.lang.reflect.Type 家族而不是Class 中获取一些东西,但这些并不是特别容易编造出来的。看起来像:
class Dummy {
Map<String, String> field;
}
...
Type typeObject = Dummy.class.getField("field").getGenericType();
鉴于此,被调用函数可以提取基本类型并将其用于强制转换或 newInstance-ing,但虚拟字段业务确实看起来很丑。
请注意,像这样的函数并不总是调用newInstance。显然,如果他们这样做了,他们就不需要打电话给resultClass.cast。
【问题讨论】: