【问题标题】:Getting Java to convert from generic class to generic object让Java从泛型类转换为泛型对象
【发布时间】:2015-12-17 21:49:21
【问题描述】:

基本上,我有三个功能:

Class<? extends Base> getClass();

T ObjectFromClass(Class<T> classOfT);

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

这段代码给了我以下编译器错误:

类型不匹配:无法从 capture#1-of 转换?将 Base 扩展到 T。

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

我错了吗?

如果我不是,有没有办法让我在这个过程中的任何时候都不必施放?

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

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

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

【问题讨论】:

  • 您能否提供更多背景信息,例如您将在何处/如何使用它的示例?
  • 我添加了对主要问题的回复,因为您似乎无法在回复中进行太多格式化。
  • 你的代码语法不正确

标签: java class generics casting


【解决方案1】:

getClass() 返回任何扩展 Base 的东西,所以没有什么可以保证这与您的其他方法中的 T 相同。

为了这个例子,假设 Base 是 Object。现在假设getClass() 将返回 Integer - 它是有效的,因为它扩展了 Object。例如,没有什么可以保证 &lt;T extends Base&gt; getObject() 中的 T 不是 String ——它还扩展了 Object (记住这是编译时间——你不能对 getClass 做出假设,除非它们都使用类声明中定义的相同 T 。

如果在方法中定义了 T,则不能假设它在两个方法中是相同的 T

【讨论】:

  • 是的,但是ObjectFromClass 返回一些 T(不是必须扩展 Base),因此您不能将其作为 getObject() 的返回类型返回,这需要它扩展 Base
  • 现在我们要找到问题的根源了。如果对象的 Class 是 Class extends Base> Object 怎么能不扩展 Base?
  • 所以它应该是一个类型化的类,在类声明中带有&lt;T extends Base&gt;,并且所有方法都应该使用这个T,而不是每个方法中都带有&lt;extends Base&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
相关资源
最近更新 更多