java实现的接口和抽象类具有相同的方法名,导致泛型名冲突

kzmpq1sx  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(372)
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

}
}

这会导致
名称冲突:foo类型的方法setvalue(m)与jformattedtextfield类型的setvalue(object)具有相同的擦除,但不重写它
为什么我从编译器那里得不到爱,我怎样才能修复它?

wf82jlnq

wf82jlnq1#

java对泛型使用类型擦除。在您的例子中,类型是string,它也是object的子类。而您的bar类允许对象名称冲突发生。
在您的场景中,因为您在扩展类中使用的是以object作为参数的非泛型遗留类,所以我将建议您更改方法名称或更改类型 FooString `回到1.4天:-)

4ngedf3f

4ngedf3f2#

这是因为类型擦除(参见这个问题:java泛型-类型擦除-何时发生和发生什么)
简而言之:编译器将使用 String 要检查所有方法调用和类型转换是否正常工作,然后,它将使用 Object 生成字节码。这意味着您现在有两个具有相同签名的方法: public void setValue(Object aValue) 没有完美的解决方案。您可以使用 Foo<Object> 而不是 Foo<String> 但这通常不是你想要的。
解决方法是使用适配器:

public class FooBar extends Bar {
    public Foo<String> adapt() {
        return new Foo<String>() {
            public void setValue(String value) {
                FooBar.this.setValue( value );
            }
        }
    }
}

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

相关问题