Ash*_*oyi 0 java generics static-methods
当我尝试编译以下代码时,编译失败并出现以下错误.我不知道为什么它应该,因为我只返回一个实现合同的类
public interface Contract {
static <T extends Contract> T get() {
return new ConcreteContract();
}
}
class ConcreteContract implements Contract {
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
有没有人知道为什么java表现这种方式(或)我错过了一些明显的东西
PS:在发布此查询之前,我已在SO中阅读了超过10个热门搜索
由于您的方法返回泛型类型T,并且T可以是任何实现的类Contract,因此可以使用以下方法调用它(例如)
OtherConcreteContract variable = Contract.get();
Run Code Online (Sandbox Code Playgroud)
并且您不能将a赋值ConcreteContract给OtherConcreteContract变量(假设ConcreteContract不是子类OtherConcreteContract).
要避免该错误,您应该返回接口类型:
static Contract get() {
return new ConcreteContract();
}
Run Code Online (Sandbox Code Playgroud)
或具体类型:
static ConcreteContract get() {
return new ConcreteContract();
}
Run Code Online (Sandbox Code Playgroud)
前者(返回接口类型)通常是更好的选择.
仿制药在这里没有帮助你.