我已经用Java创建了一个名为“ Edge”的对象。该对象是图形的有向边,该图形在其开始处存储对节点的引用,在其结束处存储对节点的引用。
这些节点当前是一个“顶点”对象,但是我也想将双边的原点存储在同一对象中,以便它会返回一个“面”对象。目前,我仅支持返回顶点,如下面的代码所示。
public class Edge{
private Vertex org; //this is the line that I want to be able to store a
//face given certain conditions (the index being 1 or 3)
private Face left; //this is a line where I want to store a face normally
//but store a Vertex if this is a dual edge
private int index; //a number from 0-3, where 1 and 3 are in the dual graph
public Vertex Org(){
return org;
}
}
我想知道是否存在一种定义函数Org()和字段org的方式,使得它可以是Face或Vertex。我想知道是否有一种使用泛型类型的方法,根据索引参数的不同,它可能会变成“顶点”或“面部”。下面是我尝试的示例。
public class Edge<T>{
public T org;
private T Org(){
return org;
}
}
但是,这似乎不是一个非常优雅的解决方案,它只能用于获取原点,而不能用于获取左面/顶点。
我想知道是否存在一种存储字段的方法,该字段可以是两种可能的对象类型之一,还是解决该问题的另一种简单方法。
答案 0 :(得分:2)
您不想从同一方法返回完全不同类型的对象,因为返回它们后将如何处理?
假设您做了:
Object faceOrVertex = edge.org(); // returns face or vertex
因此,现在您必须决定如何处理脸部或顶点。您将需要编写:
if (faceOrVertex instanceof Face) {
// cast to Face and do face stuff
} else {
// cast to Vertex and do vertex stuff
}
您最好调用两种返回已知类型的方法。
仿制药对您无济于事。他们并没有消除对不同类型的需求。
如果您的Face
和Vertex
类具有共同的功能,并且您想以共同的方式对待它们,则解决方案是两个用共同的方法声明一个接口,并使用Face
和Vertex
类实现了这些方法。但是,如果不确切知道您想对org
方法的结果做什么,就不可能推荐一些东西。
我建议您首先使用两种不同的方法来实现该解决方案,然后再寻找可以重构为共享逻辑的通用代码块。
答案 1 :(得分:-1)
您的Vertex
和Face
是两种不同的类型,因此,除非您有一个Vertex
和Face
都实现的接口,否则单个方法永远无法使用。假设您已定义接口GraphElement
。现在您的班级会出现类似这样的内容:
public interface GraphElement {
// operations
}
class Edge<V extends GraphElement, F extends GraphElement> {
V vertex;
F face;
int index;
GraphElement org() {
// processing code
return index % 2 == 0 ? face : vertex;
}
}