【问题标题】:Two classes implementing interface with different type arguments两个类实现具有不同类型参数的接口
【发布时间】:2018-11-02 12:29:26
【问题描述】:
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){}}

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

接口 I 不能被不同类型的参数 (A,B) 继承,有人有解决方法吗?

【问题讨论】:

  • 欢迎来到 SO。如果您说代码不起作用,请提供“不起作用”的更详细定义,即错误消息等...
  • 不能编译,不是多重继承,是子类和超类试图实现相同的接口但类型参数不同
  • @AndroidDev - 请将此详细信息添加到问题中,而不是将其留在 cmets 中。

标签: java


【解决方案1】:

这样的层次结构不可能有解决方法:在B 中,您想用两种不同的泛型类型实现i 接口:AB
泛型旨在带来更多的类型安全性,而这种可能的歧义则克服了这一点。来自班级的客户,为什么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;
    }
}

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

【讨论】:

  • 谢谢你的回答,这看起来不错,只是我使用的是 API,有时我需要继承
  • 不客气。不幸的是,在您的情况下,不希望继承。使用包装器/组合和委托,您应该都能获得预期的行为。
【解决方案2】:

使用下面给出的继承模型,您将在A 中实现iB 的联系。你真的不需要为class B&lt;T&gt; 实现i

请看下面的例子:

interface i<T> {


}

class A<T> implements i<T> {

}

class B<T> extends A<T> {

}

希望它能帮助你理解结构!

【讨论】:

  • 谢谢你的回答,这个结构的问题是我不能这样做:b.update(newB); a.update(newA);
【解决方案3】:

我不明白需要什么,但是这段代码是编译的))

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多