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>
尝试声明A
和C
如下
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>> { ... }
我有以下结构:
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>
尝试声明A
和C
如下
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>> { ... }