gpt4 book ai didi

java - 使用相同的方法名称实现接口(interface)和抽象类导致通用名称冲突

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:10 35 4
gpt4 key购买 nike

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

}
}

这导致

Name clash: The method setValue(M) of type Foo has the same erasure as setValue(Object) of type JFormattedTextField but does not override it

为什么编译器不喜欢我,我该如何解决?

最佳答案

这是因为类型删除(参见这个问题:Java generics - type erasure - when and what happens)

简而言之:编译器将使用 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()方法应该做的是创建一个新实例,该实例实现正确的接口(interface)并将所有方法调用映射到 this .

关于java - 使用相同的方法名称实现接口(interface)和抽象类导致通用名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12109587/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com