Java 递归中的边界不匹配 generics/inheritance

Java Bound Mismatch in recursive generics/inheritance

我有以下结构:

public abstract class A <E extends El, U extends A<E,U> > { ... }

public class B<E extends El> extends A<E, B<E> > { ... }

public abstract class C <E extends El, T extends A<E, T>> { ... }

我的问题是,为什么我可以这样做:

public class R extends C<El, B<El>> { ... }

但不是

public class R <T extends B<El>> extends C<El, T> { ... }

为什么 T(扩展 B<El>)不能很好地替代 B<El>

我得到的异常是 Bound mismatch: The type T is not a valid substitute for the bounded parameter <T extends A<El,T>> of the type C<E,T>

尝试声明AC如下

public abstract class A <E extends El, U extends A<E, ? super U>> {}
public abstract class C <E extends El, T extends A<E, ? super T>> {}
abstract class A <E extends El, U extends A<E, U> > {
}

class B<E extends El> extends A<E, B<E> > {
}

abstract class C <E extends El, T extends A<E, ? super T>> {
    public void X(T t, El a) {

    }
}


class R <T extends B<El>> extends C<El, T> {
}

My question is, why can I do this:

public class R extends C<El, B<El>> { ... }

因为El extends El,并且B<El> extends A<El, B<El>>

but not

public class R<T extends B<El>> extends C<El, T> { ... }

因为 T 没有扩展 A<El, T>。我们知道 T extends B<El>B<El> extends A<El, B<El>>,而不是 A<El, T>。这个声明通常是不安全的。

如果不知道您对 类 中的这些类型做了什么,以及为什么您认为声明是安全的,就不可能给出任何建议。例如,如果已知 A 仅用作 U 的 "consumer",那么您可以使用 super 绑定,它将起作用:

public abstract class A<E extends El, U extends A<E, ? super U>> { ... }
public abstract class C<E extends El, T extends A<E, ? super T>> { ... }