以下是一个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。显然,如果他们这样做,他们就不需要调用resultClass.cast。