让Java从泛型类转换为泛型对象

时间:2015-12-17 21:49:22

标签: java class generics casting

基本上,我有三个功能:

Class<? extends Base> getClass();

T ObjectFromClass(Class<T> classOfT);

<T extends Base> getObject(){
   return ObjectFromClass(getClass());
}

此代码给出了以下编译器错误:

类型不匹配:无法从捕获#1转换?将Base扩展为T.

现在可以通过将返回值转换为(T)来修复此问题。但是,据我所知,由于Class本身必须扩展Base,因此生成的对象也必须扩展Base,因此这个返回是类型安全的。

我错了吗?

如果我不是,有没有办法让它成为我在这个过程中的任何一点都不需要施展?

编辑:我被要求提供更多背景信息:

我正在使用gson转换为/从json转换为调用webservice。我的想法是,我有一堆请求和响应对象,用于我必须进行的各种调用。我有一个通用的getResponse(Request)函数,我希望它能根据请求自动返回正确的响应类型。我给每个请求一个getResponseType()函数,它返回它对应的响应类。所以我打电话给

T<extends Response> getResponse(Request request){ 
     ///do work to get webResponse 
     return gson.fromJson(webResponse, request.getResponseType()); 
}

1 个答案:

答案 0 :(得分:1)

getClass()会返回任何扩展Base的内容,因此没有任何内容可以保证这与您的其他方法中的T相同。

为了举例,我们假设Base是Object。现在让我们说getClass()将返回Integer - 它是有效的,因为它扩展了Object。没有什么可以保证来自<T extends Base> getObject()的T不是String例如 - 它也扩展了Object(记住这是编译时间 - 你不能对getClass做出假设,除非它们都使用在类声明中定义的相同的T 。

如果在方法中定义了T,则不能对两种方法中的T进行任何假设