java - 使用泛型实现接口(interface)时返回错误

标签 java generics interface

我有一个接口(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/

相关文章:

Swift 泛型、约束和 KeyPaths

java - 我将如何在 Java 中使用泛型来创建一个泛型接口(interface),该接口(interface)定义了一个只接受实现作为参数的方法?

android - recyclerview header,从Activity/Fragment中的header访问对象

java - 使用通用类类型实例化 DynamoDBQueryExpression

java - Java 中的 Set 不允许重复,但它接受具有相同参数的 StringBuffer 对象。为什么?

java - 如何获取另一个类中JRadioButton MenuItem的状态?

java - 并行使用相同方法的线程

json - 将 interface{} 转换为 map

java - Socket.bind 的首选网络接口(interface)

java - java程序在eclipse IDE中编译错误