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

标签 java generics java-8

以下是我的代码

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/

相关文章:

java - 使用 Selenium 将测试结果写入 Excel

c++ - 使用标准 C++ 库 vector 作为底层实现创建一个 Set 模板类

java - 如何使用 java 8 lambda 和流对 Map<YearMonth, List<LocalDate>> 进行排序

java-8 - Java 8 流已被操作或关闭

java - 在 Java 中存储不同类型对象的有序列表的最佳方法?

java - .sh 文件未按 java 预期工作

java - Hadoop 中的简单程序得到 ClassNotFoundException

java - 计算不同切片的数量(仅包含唯一数字)

c# - 将字符串转换为 IEnumerable<object>

generics - 如何从处理未知类型的多个来源安全地加载代码?