我试图从通用接口实现两次,我知道由于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函数的名称更改为解决方案。它会永远碰撞。 有没有办法在尝试编译时看到原始类型?
答案 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); }
}