メソッドを要求するインターフェース Node があります。
public HashSet getNeighbour();
NodeVariable は Node を実装し、その隣人は NodeFunction 型 (Node も実装する) であり、私はメソッドを書きました:
public HashSet<NodeFunction> getNeighbour();
(NodeFunction クラスでは逆)。
Node のメソッドのシグネチャを次のように変更すると、次のようになることがわかりました。
public HashSet<Node> getNeighbour();
次に、NodeVariable と NodeFunction のメソッドでエラーが発生します。
factorgraph.NodeFunction のエラー getNeighbour() は factorgraph.Node の getNeighbour() を実装できません 戻り型 java.util.HashSet は java.util.HashSet NodeFunction.java と互換性がありません
これは本当に明確ではありません。
私が見つけた:
拡張インターフェイスで戻り値の型をオーバーライドする - 悪い考えですか?
と
Java - 戻り値の型が独自のメソッド パラメータ型にジェネリックを使用する場合、拡張インターフェイスの戻り値の型をオーバーライドする
そして今、Node メソッドの署名を次のように変更しました。
public HashSet<? extends Node> getNeighbour();
したがって、コンパイラは不平を言うのをやめます。
そうですか?HashSet が HashSet の「拡張」と見なされないのはなぜですか?