不兼容类型java泛型问题
我真的无法理解这个Incompatible types
编译错误
interface Request {}
interface Response {}
class Foo {
<RQ extends Request, RS extends Response> RS foo(RQ rq) {
// This doesn't compile: Incompatible types error
return foo3(foo2(rq));
/* This compiles fine */
// RS rs = foo2(rq);
// return foo3(rs);
}
<RS extends Response, RQ extends Request> RS foo2(RQ rq) {
return null;
}
<RS extends Response> RS foo3(RS rs) {
return rs;
}
对我来说奇怪的是,如果在方法foo
中我替换了以下内容,那么代码编译得很好:
return foo3(foo2(rq));
作者:
RS rs = foo2(rq);
return foo3(rs);
我肯定错过了什么,但我还是不明白为什么
谢谢你的帮助
# 1 楼答案
foo2
和foo3
的RS
类型参数不相关。如果要强制它们相同,请将type参数置于类级别# 2 楼答案
那是因为在使用
编译器知道将哪个具体类型(
RS
)用于foo2
的专门化。你是在告诉它你想要哪种类型在
foo3(foo2(rq));
的情况下,编译器无法推断出这一点。因此,您只需要得到不太专业化的类型Response
,作为foo2
的结果,它不适用于foo3
请注意,这种自动推断是必要的,因为每个方法的类型参数
RS
都是独立的。没有人保证它们在整个类中引用相同的类型。如果您希望它们在整个类中相同,请将类本身设置为泛型,而不是方法