基本上,我有三个功能:
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());
}
答案 0 :(得分:1)
getClass()
会返回任何扩展Base
的内容,因此没有任何内容可以保证这与您的其他方法中的T相同。
为了举例,我们假设Base是Object。现在让我们说getClass()
将返回Integer - 它是有效的,因为它扩展了Object。没有什么可以保证来自<T extends Base> getObject()
的T不是String例如 - 它也扩展了Object(记住这是编译时间 - 你不能对getClass做出假设,除非它们都使用在类声明中定义的相同的T 。
如果在方法中定义了T,则不能对两种方法中的T进行任何假设