不兼容类型java泛型问题
我真的无法理解这个不兼容类型java泛型问题,java,generics,incompatibletypeerror,Java,Generics,Incompatibletypeerror,我真的无法理解这个不兼容类型编译错误 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 compil
不兼容类型
编译错误
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;
}
作者:
我肯定错过了什么,但我还是不明白为什么
谢谢您的帮助。
foo2
和foo3
的RS
类型参数不相关。如果要强制它们相同,请将type参数置于类级别
class Foo <RQ extends Request, RS extends Response> {
RS foo(RQ rq) {
return foo3(foo2(rq));
}
RS foo2(RQ rq) {
return null;
}
RS foo3(RS rs) {
return rs;
}
}
class-Foo{
RS foo(RQ RQ){
返回foo3(foo2(rq));
}
RS foo2(RQ RQ){
返回null;
}
卢比3(卢比){
返回rs;
}
}
这是因为在使用
RS rs = foo2(rq);
return foo3(rs);
编译器知道使用哪个具体类型(RS
)专门化foo2
。你是在告诉它你想要哪种类型
在foo3(foo2(rq))的情况下代码>编译器无法推断出这一点。因此,由于foo2
,您只得到了不太专业化的类型响应
,而这不适用于foo3
请注意,这种自动推断是必要的,因为类型参数RS
对于每种方法都是独立的。没有人保证它们在整个类中引用相同的类型。如果你想让它们在整个类中都是一样的,那就让类本身成为泛型的,而不是方法。谢谢你的叫醒电话谢谢你的回答,现在我明白了!
class Foo <RQ extends Request, RS extends Response> {
RS foo(RQ rq) {
return foo3(foo2(rq));
}
RS foo2(RQ rq) {
return null;
}
RS foo3(RS rs) {
return rs;
}
}
RS rs = foo2(rq);
return foo3(rs);