Java 使用相同的方法名实现接口和抽象类,导致泛型名称冲突 公共接口Foo{ 无效设定值(T值); } 公共抽象类栏扩展了JFormattedTextField{ @凌驾 公共无效设置值(对象值){ } } 公共类FooBar扩展了FooBar实现了Foo{ @重写//Foo 公共void setValue(字符串aValue){ //TODO自动生成的方法存根 } @覆盖//条 公共无效设置值(对象有效){ //TODO自动生成的方法存根 } }

Java 使用相同的方法名实现接口和抽象类,导致泛型名称冲突 公共接口Foo{ 无效设定值(T值); } 公共抽象类栏扩展了JFormattedTextField{ @凌驾 公共无效设置值(对象值){ } } 公共类FooBar扩展了FooBar实现了Foo{ @重写//Foo 公共void setValue(字符串aValue){ //TODO自动生成的方法存根 } @覆盖//条 公共无效设置值(对象有效){ //TODO自动生成的方法存根 } },java,generics,interface,name-clash,Java,Generics,Interface,Name Clash,这导致 名称冲突:Foo类型的方法setValue(M)具有相同的 擦除为JFormattedTextField类型的setValue(对象),但不 覆盖它 为什么我没有从编译器那里得到爱,我怎样才能修复它呢?Java对泛型使用类型擦除。在您的案例中,类型是String,它也是Object的子类。并且您的Bar类允许对象名称冲突发生 在您的场景中,因为您在扩展类中使用的是一个非泛型的遗留类,对象作为参数,所以我建议您更改方法名称或将Foo的类型更改为String`返回到1.4天:-)这是因为类型

这导致

名称冲突:Foo类型的方法setValue(M)具有相同的 擦除为JFormattedTextField类型的setValue(对象),但不 覆盖它


为什么我没有从编译器那里得到爱,我怎样才能修复它呢?

Java对泛型使用类型擦除。在您的案例中,类型是String,它也是Object的子类。并且您的Bar类允许对象名称冲突发生


在您的场景中,因为您在扩展类中使用的是一个非泛型的遗留类,对象作为参数,所以我建议您更改方法名称或将
Foo
的类型更改为
String
`返回到1.4天:-)

这是因为类型擦除(请参见此问题:)

简而言之:编译器将使用
String
检查所有方法调用和类型转换是否正常工作,然后使用
Object
生成字节码。这意味着您现在有两个具有相同签名的方法:
publicsvoidsetvalue(objectavalue)

没有完美的解决方案。您可以使用
Foo
而不是
Foo
来编译上面的代码,但这通常不是您想要的

解决方法是使用适配器:

public interface Foo <T> {
   void setValue(T value);
}

public abstract class Bar extends JFormattedTextField{
    @Override
    public void setValue(Object value) {

    }
}

public class FooBar extends Bar implements Foo<String>{
    @Override //Foo
    public void setValue(String aValue) {
    // TODO Auto-generated method stub

    }

    @Override //Bar
    public void setValue(Object aValue) {
    // TODO Auto-generated method stub

}
}
public类FooBar扩展了FooBar{
公共食物适应{
返回新的Foo(){
公共void设置值(字符串值){
FooBar.this.setValue(值);
}
}
}
}

基本上,
adapt()
方法应该做的是创建一个新实例,该实例实现正确的接口,并将所有方法调用映射到

桥接方法是您的问题:因此编译器将把我的FooBar类中的setValue(字符串值)转换为setValue(对象值),就因为它是从Foo实现的?如果我没有从Foo实现,它会让setValue(字符串值)保持原样吗?因为我可以在一个类中有两个名称相同但参数不同的方法?是的。它知道
T
String
,这意味着
setValue(String)
必须是接口中定义的方法。它需要知道这一点,以便在生成字节码时能够正确地删除类型。我不确定您是否理解我的问题,或者我是否理解您的注释的答案。无论如何,我要把你的答案标记为解决方案,因为它比AmitD的答案更详细。@Torsten:我不是想让你完全绝望,但即使在这个网站上有86000分,泛型也会让人困惑:-)
public class FooBar extends Bar {
    public Foo<String> adapt() {
        return new Foo<String>() {
            public void setValue(String value) {
                FooBar.this.setValue( value );
            }
        }
    }
}