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

2024-05-04

以下是我的代码

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);.

错误是

类型 C 中的方法acceptParameterOfTypeA(A2) 不是 适用于论点 (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) { .. }

What is U? U是一个子类型First<T, U>.

But if U可以替换为First类型擦除后,这意味着First extends First<T, First>,这不是真的,因为U代表子类型First,它是用一些具体的子类型参数化的Second and 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 and U, 例如:

class Fourth extends First<Second, Fourth> {
    Fourth getU() {
        return this;
    }
}

In the getU()方法,只需要做return this;因为这将返回正确的替代品U在超类中。

更多信息:

  • “getThis”技巧是什么? http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#FAQ206
  • 具有泛型的策略模式 http://www.javaspecialists.co.za/archive/newsletter.do?issue=123
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么以下带有循环泛型的代码无法编译? 的相关文章

随机推荐