有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我的结构如下:

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) 个答案

  1. # 1 楼答案

    My question is, why can I do this:

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

    因为El extends ElB<El> extends A<El, B<El>>

    but not

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

    因为T不扩展A<El, T>。我们知道{}和{},而不是{}。该声明通常是不安全的

    在不知道如何处理类中的这些类型以及为什么认为声明是安全的情况下,不可能给出任何建议。例如,如果已知A仅充当U的“消费者”,那么您可以使用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. # 2 楼答案

    尝试声明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>> {}
    
  3. # 3 楼答案

    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> {
    }