两个类使用不同类型的参数实现接口

时间:2018-11-02 12:29:27

标签: java

class SingleTon{
   Data<A> a;
   Data<B> b;
   Data<C> c;
   // ... etc
   class Data<O extends I<O>>{
       O o;
       public void update(O o){
          this.o.update(o);
       }   
   }
}
interface I<T>{
   void update(T t);
}

class A implements I<A>{

    private String a;

    @Override
    public void update(A a) {
        this.a = a.a;
    }
}

class B extends A implements I<B>{

    private String b;

    @Override
    public void update(B b) {
       super.update(b);
       this.b = b.b;
    }
}
class C implements I<C> {public void update(C c){}}

由于超级类和子类试图实现相同的接口但具有不同的类型参数,因此无法编译此代码。

接口我不能使用不同的类型参数(A,B)进行继承,有人可以解决此问题吗?

3 个答案:

答案 0 :(得分:1)

使用这种层次结构无法解决:在B中,您想使用两种不同的通用类型:iA来实现B接口。
泛型被设计为带来更多的类型安全性,这种可能的歧义消除了这种情况。从班级的客户那里,为什么update(B b)有效但update(A a)无效?
因此,编译器将永远不会接受它。

但是有了组合,您可以做到:

class B  implements i<B>{
    private A a;
    private String b;

    @Override
    public void update(B b) {
       super.update(b);
       this.b = b.b;
    }
}

现在,如果需要A a实例,则可以使用B字段。

答案 1 :(得分:0)

使用下面给出的继承模型,您将在i中实现BA的联系。您实际上不需要为i实现class B<T>

请参见以下示例:

interface i<T> {


}

class A<T> implements i<T> {

}

class B<T> extends A<T> {

}

希望它可以帮助您了解结构!

答案 2 :(得分:0)

我不明白需要什么,但是此代码已编译))

interface i<T extends i<T>> {
    void update(T t);
}

class A<Q extends A<Q>> implements i<Q> {
    private String a;

    @Override
    public void update(A a) {
        this.a = a.a;
    }
}

class B<X extends B<X>> extends A<X> implements i<X>  {
    String b;

    @Override
    public void update(X b) {
        super.update(b);
        this.b = b.b;
    }
}