当我尝试编译以下代码时,编译失败并显示以下错误。我不确定为什么要这么做,因为我只返回实现合同的类
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热门搜索
答案 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而不是您要返回的内容的原因。