Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
can';t在Java中从泛型接口实现_Java_Generics - Fatal编程技术网

can';t在Java中从泛型接口实现

can';t在Java中从泛型接口实现,java,generics,Java,Generics,我曾两次尝试从泛型接口实现,我知道这在java中是不可能的,因为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(St

我曾两次尝试从泛型接口实现,我知道这在java中是不可能的,因为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){}

}
接口A{final static int i=3;}
接口B扩展了{void f(T);}
接口D扩展了B{}
C类实现B、D{
公共空f(字符串t){}
公共空f(双t){}
}
因此,我尝试包装其中一个接口,以便B不会被实现两次,我选择
B
,并用接口D包装它。 现在我遇到另一个编译错误:
B不能用不同的参数继承:
有人有别的想法吗? 我不知道为什么会出现这个编译错误

p、 这与线程不同
因为我不能将f函数的名称更改为解决方案。它总是会发生碰撞在尝试编译时,有没有办法查看原始类型?

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

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); }
}
C类{
private final B=new B(){@Override public void f(字符串s){};
private final D D=new D(){@Override public void f(Double x){};
空f(字符串s){b.f(s);}
空f(双x){d.f(x);}
}

您想要实现什么目标?纯粹的假设性问题没有任何意义。阅读类型擦除基本上,你的问题是你试图同时实现B和B(因为od D),但在编译过程中的某个时刻,这两种类型只是普通的B,所以当你实现f(…)时,编译器无法理解您的观点。@GhostCat Hi:)我有个主意。提交前关闭:p@Filip据我所知,Malczak编译器只替换T和,而不是具体类型。像f(String),f(Double)。那么为什么编译器不能编译它呢?另外,如果它用f(Object)替换f(String)/f(Double),那么为什么任何泛型方法都可以工作呢?java中的方法参数没有差异,所以重写永远不能用于泛型接口。嗯…@Aviad Shiber-我向你保证语言参考和教程已经有了所有答案。