Java绑定在递归泛型/继承中不匹配

时间:2015-06-15 08:20:06

标签: java oop generics inheritance abstraction

我有以下结构:

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>

3 个答案:

答案 0 :(得分:1)

尝试按以下方式声明Cpublic 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 ElB<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> {
}
相关问题