我有以下结构:
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>
答案 0 :(得分:1)
尝试按以下方式声明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>> {}
public class MyHelper
{
public static int MyVal {get; set;}
}
答案 1 :(得分:1)
我的问题是,为什么我可以这样做:
public class R extends C<El, B<El>> { ... }
因为El extends El
和B<El> extends A<El, B<El>>
但不是
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
仅用作&#34;消费者&#34; U
的{{1}},然后您可以使用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>> { ... }
答案 2 :(得分:0)
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> {
}