无法从Java中的通用接口实现

时间:2017-08-19 18:51:12

标签: java generics

我试图从通用接口实现两次,我知道由于java泛型中的'type erasure',它在java中是不可能的,所以我想知道如何找到解决它的方法。这是我测试的代码:

interface A{final static int i=3;}

interface B<T> extends A{void f(T t);}
interface D extends B<Double>{}
class C implements B<String>,D{
    public void f(String t){}
    public void f(Double t){}

}

所以我尝试包装其中一个接口,这样B就不会实现两次我选择B<Double>并用接口D包装它。 现在我收到另一个编译错误:B cannot be inherited with different arguments: <java.lang.String> and <java.lang.Double> 谁有另一个想法? 我不知道为什么我得到这个编译错误..

p.s-这与线程Implementing multiple instances of the same generic Java interface with different generic types?不同 因为我无法将f函数的名称更改为解决方案。它会永远碰撞。 有没有办法在尝试编译时看到原始类型?

1 个答案:

答案 0 :(得分:0)

像这样的复杂继承几乎总是一个坏主意。您遇到的情况就是一个很好的例子。强烈考虑使用构图:

class C {
  private final B<String> b = new B<String>() { @Override public void f(String s) {} };
  private final D d = new D() { @Override public void f(Double x) {} };
  void f(String s) { b.f(s); }
  void f(Double x) { d.f(x); }
}