如何在Java的字段中存储变量类型的对象?

时间:2019-05-23 12:28:58

标签: java generics

我已经用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;
    }

}

但是,这似乎不是一个非常优雅的解决方案,它只能用于获取原点,而不能用于获取左面/顶点。

我想知道是否存在一种存储字段的方法,该字段可以是两种可能的对象类型之一,还是解决该问题的另一种简单方法。

2 个答案:

答案 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
}

您最好调用两种返回已知类型的方法。

仿制药对您无济于事。他们并没有消除对不同类型的需求。

如果您的FaceVertex类具有共同的功能,并且您想以共同的方式对待它们,则解决方案是两个用共同的方法声明一个接口,并使用FaceVertex类实现了这些方法。但是,如果不确切知道您想对org方法的结果做什么,就不可能推荐一些东西。

我建议您首先使用两种不同的方法来实现该解决方案,然后再寻找可以重构为共享逻辑的通用代码块。

答案 1 :(得分:-1)

您的VertexFace是两种不同的类型,因此,除非您有一个VertexFace都实现的接口,否则单个方法永远无法使用。假设您已定义接口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;
    }
}