根据提出的问题和回答的问题here https://stackoverflow.com/questions/6650532/recursive-java-generics-between-two-classes,我有第二个,更复杂的一个(至少在我看来)。不过,为了使阅读(和回答)更容易,我将在此处重申完整的代码示例:
让我们首先定义一组类/接口:
public interface Node<NT extends Node<NT, ET>, ET extends Edge<NT, ET>> {
/* internal datastructures here */
}
public interface Edge<NT extends Node<NT, ET>, ET extends Edge<NT, ET>> {
/* internal datastructures here */
}
public interface Graph<NT extends Node<NT, ET>, ET extends Edge<NT, ET>> {
/* internal datastructures here */
}
public class JunctionNode implements Node<JunctionNode, RoadEdge> {
}
public class RoadEdge implements Edge<JunctionNode, RoadEdge> {
}
public class StreetGraph implements Graph<JunctionNode, RoadEdge> {
}
public class PTNode implements Node<PTNode, PTEdge> {
}
public class PTEdge implements Edge<PTNode, PTEdge> {
}
public class PTGraph implements Graph<PTNode, PTEdge> {
}
我现在需要定义一个联运图,即包含 PTEdges 和 RoadEdges 的图。在我看来,我会通过声明来做到这一点
public class IntermodalGraph implements Graph<Node, Edge> {
}
这里编译器抱怨 Node 和 Edge,因为 Node 被定义为有两个类型参数,其中一个参数派生自第二种类型(此处为 Edge)。这意味着,我必须声明
public class IntermodalGraph implements Graph<Node<Node, Edge>, Edge> {
}
到目前为止,第一个类型参数 (Node) 没问题,但第二个类型参数 (Edge) 失败,因为 Edge 再次采用两个类型参数,第一个类型参数源自 Node。所以,我会写
public class IntermodalGraph implements Graph<Node<Node, Edge>, Edge<Node<Node, Edge>>, Edge> {
}
现在,第二个类型参数没问题,但第一个类型参数(显然)又“不好”了。
最后,我想实现一些类似的代码
IntermodalGraph ig = new IntermodalGraph();
ig.add(new PTEdge());
ig.add(new RoadEdge());
Set<Edge> edges = ig.getEdges();
那么有人知道如何在保持类型安全的同时实现这一目标吗?
lg,
马蒂亚斯