两个类之间的递归javagenerics

这个问题类似于两个类之间可能递归的Javagenerics中提出的问题。 但是,到目前为止,在其他线程中,一切正常。 在我的情况下,我不幸地需要使用递归方法的其他类。

更具体一点:我想使用边和节点定义图类。 然后,我想从图表类派生一个街道图,它使用道路和交汇点作为边和节点。 另外,我想使用铁路和停靠点作为边缘和节点来推导公共交通图。 最后,我想定义一个包含街道图或公共交通图的变量。 最后一步是迄今为止我无法实现的目标。 语言如此之多; 现在让我们来看看Java代码:

public interface Node<NT extends Node, ET extends Edge> { /* internal datastructures here */ } public interface Edge<NT extends Node, ET extends Edge> { /* internal datastructures here */ } public interface Graph<NT extends Node, ET extends Edge> { /* internal datastructures here */ } public class JunctionNode implements Node { } public class RoadEdge implements Edge { } public class StreetGraph implements Graph { } public class PTNode implements Node { } public class PTEdge implements Edge { } public class PTGraph implements Graph { } 

现在,到目前为止的定义。 我想做的是:

 StreetGraph street = new StreetGraph(); PTGraph ptGraph = new PTGraph(); Graph g = street; ... g = ptGraph; ... 

但是,我希望避免对原始类型等发出警告。所以显而易见的方法是:

 Graph g = street; 

但是,这是不可能的,因为Edge不是Node的ET的有效替代品(这对我来说绝对清楚)。 我需要这样的东西:

 Graph<NT = Node, ET = Edge> g; 

这是(如预期的那样)无效的Java代码。 任何想法,如何实现有效的Java代码没有警告/错误和类型安全?

任何帮助赞赏。

谢谢,马蒂亚斯

正如Paulo所说,我认为通配符参数可能正是您所寻找的。

假设您的Graph接口具有这些方法

 public interface Graph, ET extends Edge> { public NT getNode(); public ET getEdge(); } 

并且您的StreetGraph以这种方式实现它们

 public class StreetGraph implements Graph { public RoadEdge getEdge() { return edge; } public JunctionNode getNode() { return node; } } 

那么你可以做到以下几点,所有类型安全和编译友好:

  Graph g = new PTGraph(); g = new StreetGraph(); Node n = g.getNode(); Edge e = g.getEdge(); 

然后处理NodeEdge接口,与底层实现无关。

如果您需要额外的类型信息,例如,如果您想要访问特定于JunctionNode和RoadEdge但未包含在Node和/或Edge接口中的方法,那么您将使用更具体的StreetGraph而不是Graph

 StreetGraph sg = new StreetGraph(); JunctionNode jn = sg.getNode(); RoadEdge re = sg.getEdge(); 

PTGraphStreetGraph常见超类型将是

 Graph 

这对你有用吗?