gpt4 book ai didi

java - 为什么以下带有循环泛型的代码无法编译?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:16:04 26 4
gpt4 key购买 nike

以下是我的代码

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) { .. }

什么是 UUFirst<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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com