两个类之间的递归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();
然后处理Node
和Edge
接口,与底层实现无关。
如果您需要额外的类型信息,例如,如果您想要访问特定于JunctionNode和RoadEdge但未包含在Node和/或Edge接口中的方法,那么您将使用更具体的StreetGraph
而不是Graph, ?>
:
StreetGraph sg = new StreetGraph(); JunctionNode jn = sg.getNode(); RoadEdge re = sg.getEdge();
PTGraph
和StreetGraph
常见超类型将是
Graph, ?>
这对你有用吗?