以下是我的代码
class A<B2 extends B, A2 extends A<B2, A2>> {
C<B2, A2> c;
void test() {
c.acceptParameterOfTypeA(this);
}
}
class B {
}
class C<B2 extends B, A2 extends A<B2, A2>> {
void acceptParameterOfTypeA(A2 a) {
}
}
错误发生在c.acceptParameterOfTypeA(this);
。
错误是
The method acceptParameterOfTypeA(A2) in the type C is not applicable for the arguments (A)
据我所知,acceptParameterOfTypeA
方法需要一个 A 类型的参数,而在给出错误的行中的 this
是 A 类型的。
我做错了什么?如何解决这个问题?
如果它很重要,我正在使用 Java8
最佳答案
我将再次重命名您的类,以便一切都更具可读性。那么,让我们:
public class First<T extends Second, U extends First<T, U>> {
Third<T, U> c;
void test() {
c.acceptParameterOfTypeA(this);
}
}
class Second {
}
public class Third<X extends Second, Y extends First<X, Y>> {
void acceptParameterOfTypeA(Y a) {
}
}
来自c
的定义成员 ( Third<T, U>
),我们可以得出结论 c
将公开具有此签名的方法:
void acceptParameterOfTypeA(U a) { .. }
什么是 U
? U
是 First<T, U>
的子类型.
但是如果U
可以用 First
代替在类型删除之后,这将意味着 First extends First<T, First>
,这是不正确的,因为 U
代表First
的子类型, 用 Second
的一些具体子类型参数化和 First
.
为了到达U
,您可以应用所谓的 Get This
方法。
首先,因为您需要 U
,它是 First
的子类型, 但无法从 First
获取,你可以介绍一个abstract
返回它的方法:
abstract class First<T extends Second, U extends First<T, U>> {
Third<T, U> c;
void test() {
c.acceptParameterOfTypeA(getU());
}
abstract U getU();
}
然后,实现 First
的示例子类, 称为 Fourth
, 它扩展了 First
T
的一些具体类型和 U
,例如:
class Fourth extends First<Second, Fourth> {
Fourth getU() {
return this;
}
}
在getU()
方法,就做return this;
因为这将返回 U
的正确替代品在父类(super class)中。
更多信息:
关于java - 为什么以下带有循环泛型的代码无法编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31706582/