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)具有相同的擦除,但不重写它
为什么我从编译器那里得不到爱,我怎样才能修复它?
2条答案
按热度按时间wf82jlnq1#
java对泛型使用类型擦除。在您的例子中,类型是string,它也是object的子类。而您的bar类允许对象名称冲突发生。
在您的场景中,因为您在扩展类中使用的是以object作为参数的非泛型遗留类,所以我将建议您更改方法名称或更改类型
Foo
至String
`回到1.4天:-)4ngedf3f2#
这是因为类型擦除(参见这个问题:java泛型-类型擦除-何时发生和发生什么)
简而言之:编译器将使用
String
要检查所有方法调用和类型转换是否正常工作,然后,它将使用Object
生成字节码。这意味着您现在有两个具有相同签名的方法:public void setValue(Object aValue)
没有完美的解决方案。您可以使用Foo<Object>
而不是Foo<String>
但这通常不是你想要的。解决方法是使用适配器:
基本上是什么
adapt()
方法应该做的是创建一个实现正确接口的新示例,并将所有方法调用Map到this
.