这是一个Java通用模式:
public <T> T getResultData(Class<T> resultClass, other_args) {
...
return resultClass.cast(T-thing);
}
Run Code Online (Sandbox Code Playgroud)
典型的通话看起来像:
DoubleBuffer buffer;
buffer = thing.getResultData(DoubleBuffer.class, args);
Run Code Online (Sandbox Code Playgroud)
当期望的返回类型本身是通用的时候,我从来没有弄清楚如何干净地使用这个模式.要"具体",如果这样的函数想要返回Map<String,String>怎么办?因为你不能获得泛型的类对象,当然,唯一的选择是传递Map.class,然后你需要一个强制转换和一个@SuppressWarning毕竟.
一个人最终会打电话:
Map<String, String> returnedMap;
returnedMap = thing.getResultData(Map.class, some_other_args);
Run Code Online (Sandbox Code Playgroud)
现在回到需要强制转换并抑制警告.
我想人们可以从java.lang.reflect.Type家里取出一些东西而不是它Class,但那些并不是特别容易编造的.看起来像:
class Dummy {
Map<String, String> field;
}
...
Type typeObject = Dummy.class.getField("field").getGenericType();
Run Code Online (Sandbox Code Playgroud)
鉴于此,被调用函数可以提取基类型并将其用于转换或newInstance,但虚拟字段业务肯定看起来很难看.
请注意,这样的函数并不总是调用newInstance.显然,如果他们这样做,他们就不需要打电话了resultClass.cast.
您无法在标准Java API中执行此操作.但是,有一些实用程序类可以从Type泛型类中获取.例如,Google Gson(将JSON转换为值得信赖的Javabeans,反之亦然)就是一个TypeToken类.您可以按如下方式使用它:
List<Person> persons = new Gson().fromJson(json, new TypeToken<List<Person>>() {}.getType());
Run Code Online (Sandbox Code Playgroud)
这样的结构正是你所需要的.你可以在这里找到源sode,你也可以发现它很有用.它只需要一个getResultData()可以接受a 的附加方法Type.