使用静态方法泛型时的不兼容类型

时间:2018-08-02 12:18:55

标签: java generics static-methods

当我尝试编译以下代码时,编译失败并显示以下错误。我不确定为什么要这么做,因为我只返回实现合同的类

public interface Contract {
  static <T extends Contract> T get() {
    return new ConcreteContract();
  }
}

class ConcreteContract implements Contract {
}

Contract.java:3: error: incompatible types: ConcreteContract cannot be converted to T
    return new ConcreteContract();
           ^
  where T is a type-variable:
    T extends Contract declared in method <T>get()
1 error

有人知道为什么Java会以这种方式表现(或者)我是否缺少明显的东西

PS:在发布此查询之前,我已经阅读了10多个SO热门搜索

2 个答案:

答案 0 :(得分:7)

由于您的方法返回通用类型T,并且T可以是实现Contract的任何类,因此可以使用以下方法调用它:

OtherConcreteContract variable = Contract.get();

您不能将ConcreteContract分配给OtherConcreteContract变量(假设ConcreteContract不是OtherConcreteContract的子类)。

为避免该错误,您应该返回接口类型:

static Contract get() {
    return new ConcreteContract();
}

或具体类型:

static ConcreteContract get() {
    return new ConcreteContract();
}

前者(返回接口类型)通常是更好的选择。

仿制药对您没有帮助。

答案 1 :(得分:0)

您需要将最终返回类型转换为类型T。

要指定T是否必须是Contract或其子类。意味着您正在限制将用作通用类型的类型。

在返回时,您应严格遵守使用时定义的泛型类型,这就是编译器抱怨您返回类型T而不是您要返回的内容的原因。

相关问题