【问题标题】:how to send Class<T> to a generic method如何将 Class<T> 发送到泛型方法
【发布时间】:2017-06-14 14:51:49
【问题描述】:
IosPartner extends Partner

AndroidPartner extends Partner

我有这个代码:

    Class<T> clazz = partnerStr.contains("itunes")? IosPartner.class : AndroidPartner.class;

    Partner partnerToAdd = jsonUtility.toObject(partnerStr, clazz);

public <T> T toObject(String json, Class<T> clazz) {
        if (json == null)
            return null;
...

我得到一个编译错误:

Error:(64, 52) java: incompatible types: java.lang.Object cannot be converted to com.waze.sdkService.operations.uiDto.Partner

我应该如何修复我的代码以进行泛化?

【问题讨论】:

  • Class&lt;T&gt; clazz = partnerStr.contains("itunes")? IosPartner.class : AndroidPartner.class; 也不应该编译,但消息会有所不同,因此您有多个问题。您应该更新您的问题以包含MCVE,即使它没有编译,但只需确保唯一的编译错误是您要询问的错误。就问题而言,没有足够的信息让我告诉你你想做什么。
  • T 类是什么?它是另一个独立于 jsonUtility 期望的类型变量吗?

标签: java class generics


【解决方案1】:

您需要告诉编译器您传递给toObject()Class 对象不仅仅是任何Class,而是一个代表扩展Partner 的类的具体对象。为此,请像这样声明其类型:

Class<? extends Partner> clazz = partnerStr.contains("itunes")
        ? IosPartner.class : AndroidPartner.class;

【讨论】:

  • 为什么Class clazz = partnerStr.contains("itunes") ? IosPartner.class : AndroidPartner.class;会抛出编译错误?对于Partner partnerToAdd = jsonUtility.toObject(partnerStr, clazz);
【解决方案2】:

这只是在不必要时使用T 的问题。由于这两个类都扩展了Partner,因此只需使用Class&lt;? extends Partner 而不是Class&lt;T&gt;

编辑:@John Bollinger 打败了我。

【讨论】:

    猜你喜欢
    • 2015-06-14
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多