使用泛型返回接口实现中的错误

Dal*_*him 1 java generics interface

我有一个定义这样的方法的接口:

public List<IA> myMethod();
Run Code Online (Sandbox Code Playgroud)

IA另一个界面.

在我的方法实现中,我声明:

public List<A> myMethod() { /* Do something */ }
Run Code Online (Sandbox Code Playgroud)

A一个类实现IA.

但是,Java(或eclipse)不喜欢它并迫使我List<IA>在我的实现中myMethod.作为A工具IA,我不明白为什么会抛出错误.

所以这里是问题:

  • 为什么我有这个错误?
  • 哪种方法可以避免它(知道我对代码没有太多自由)?

Jon*_*eet 5

您有此错误,因为从类型安全的角度来看它是不安全的.考虑:

// 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());
Run Code Online (Sandbox Code Playgroud)

你真的希望能够添加Apple一个ArrayList<Banana>

您可以通过将声明更改为来解决此问题

List<? extends IA> myMethod();
Run Code Online (Sandbox Code Playgroud)

这将阻止调用添加到列表(或设置值).

如果您无法更改界面,我将不得不List<IA>从您的方法返回一个,我担心.

有关更多信息,请参阅Java Generics FAQ.