不兼容的类型 java 泛型问题
Incompatible Types java generics issue
我真的无法理解这个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);
我肯定漏掉了什么,但我还是不明白为什么。
感谢您的帮助。
foo2
的和foo3
的RS
类型参数没有关系。如果你想强制它们相同,请将类型参数放在class级别。
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);
编译器知道将哪个具体类型 (RS
) 用于 foo2
的特化。你是在明确告诉它你想要哪种类型。
在 foo3(foo2(rq));
的情况下,编译器无法推断出这一点。因此,由于 foo2
,您只得到不太专业的类型 Response
,它不适用于 foo3
。
请注意,此自动推导是必要的,因为类型参数 RS
对于每个方法都是 独立的 。没有人保证它们在整个 class 中指的是同一类型。如果您希望它们在整个 class 中相同,请使 class 本身通用,而不是方法。
我真的无法理解这个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);
我肯定漏掉了什么,但我还是不明白为什么。
感谢您的帮助。
foo2
的和foo3
的RS
类型参数没有关系。如果你想强制它们相同,请将类型参数放在class级别。
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);
编译器知道将哪个具体类型 (RS
) 用于 foo2
的特化。你是在明确告诉它你想要哪种类型。
在 foo3(foo2(rq));
的情况下,编译器无法推断出这一点。因此,由于 foo2
,您只得到不太专业的类型 Response
,它不适用于 foo3
。
请注意,此自动推导是必要的,因为类型参数 RS
对于每个方法都是 独立的 。没有人保证它们在整个 class 中指的是同一类型。如果您希望它们在整个 class 中相同,请使 class 本身通用,而不是方法。