我有一个接口(interface)定义这样的方法:
public List<IA> myMethod();
与 IA
另一个界面。
在我声明的方法的实现中:
public List<A> myMethod() { /* Do something */ }
与 A
一个实现 IA
的类.
但是,Java(或 eclipse)不喜欢它并迫使我拥有 List<IA>
在我的实现中 myMethod
.作为A
工具 IA
,我不明白为什么这会引发错误。
下面是问题:
- 为什么会出现此错误?
- 避免它的最佳方法是什么(我知道我对代码没有太多自由)?
最佳答案
你有这个错误是因为从类型安全的角度来看它是不安全的。考虑:
// Interface declaration
List<Fruit> myMethod();
// Implemented by...
public List<Banana> myMethod() {
return new ArrayList<Banana>();
}
// Called as:
List<Fruit> fruit = foo.myMethod();
fruit.add(new Apple());
你真的想添加一个 Apple
吗?到ArrayList<Banana>
?
您可以通过将声明更改为来解决此问题
List<? extends IA> myMethod();
这将阻止调用添加到列表(或在其上设置值)。
如果你不能改变界面,你将返回一个List<IA>
恐怕从你的方法来看。
参见 Java Generics FAQ了解更多信息。
关于java - 使用泛型实现接口(interface)时返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8225992/