java - 扩展方法中的返回类型哈希表

标签 java hashset extending

我有一个接口(interface) Node 要求方法:

public HashSet getNeighbour();

NodeVariable 实现 Node,它的邻居是 NodeFunction 类型(也实现 Node),我编写了该方法:

public HashSet<NodeFunction> getNeighbour();

(在 NodeFunction 类中反之亦然)。

我发现如果我将 Node 中方法的签名更改为:

public HashSet<Node> getNeighbour();

然后在 NodeVariable 和 NodeFunction 中的方法上我收到错误:

Error getNeighbour() in factorgraph.NodeFunction cannot implement getNeighbour() in factorgraph.Node return type java.util.HashSet is not compatible with java.util.HashSet NodeFunction.java

这个还不太清楚。

我发现:

Overriding return type in extended interface - Bad idea?

Java - Overriding return type of extended interface when return type uses generics for own method parameter types

现在我更改了 Node 方法签名:

public HashSet<? extends Node> getNeighbour();

因此编译器不再提示。

是吗?为什么 HashSet 不被视为 HashSet 的“扩展”?

最佳答案

首先,最好根据其他接口(interface)而不是具体实现来定义接口(interface)中的方法。我想说的是 getNeighbour() 方法应该是:

public Set getNeighbour();

既然我们知道它只能返回 Node(或 Node 的子类型),我们不妨这样定义它:

public Set<? extends Node> getNeighbour();

关于java - 扩展方法中的返回类型哈希表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7867152/

相关文章:

java - 什么是 Map<MyClassType1,Object> 类

java - 具有双嵌入键的 SqlResultSetMapping

c - 扩展 PythonCE 以从 PythonCE 轻松访问 gsm/camera/gps

c# - HashSet 在 C# 中删除项目时进行迭代

java - 用 Java 实现一个包

ruby - 我可以使用方法作为 lambda 吗?

javascript - TypeScript 在 Namespace 下扩展 JQuery

java - 如何检查流中是否为空?

java - 将 Android Activity 从堆栈移至前端时,如何刷新(重新初始化)它们?所以要再次运行 onCreate 等

Java在HashSet中找到最常见的值