首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承和泛型

继承和泛型
EN

Stack Overflow用户
提问于 2012-12-19 09:56:05
回答 4查看 193关注 0票数 5

我有一个应用程序,它对节点和边的图G(N,E)执行各种分析算法。节点和边的属性随应用程序的不同而变化,并根据图的类型和属性的性质形成继承层次结构。例如,节点层次结构的根可以表示最通用的无向循环图(NcgNode)。NcgNode的一个子类可能表示有向循环图(DcgNode),然后是DagNode等。可以应用于DAG的算法与NCG的算法不同,但不是相反。树的根的一个关键行为是添加和检索图的相邻节点。问题是如何在不创建“未检查”异常的情况下做到这一点?

代码的简明版本可能如下所示:

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.List;

public class NcgNode {
    private List<NcgNode> nodeList_ = null;
    private List<? extends NcgNode> nodeListSrc_ = null;
    private List<? super NcgNode> nodeListSink_ = null;

    public <N extends NcgNode> void addNode(N node) {
        if (nodeList_ == null) {
            nodeList_ = new ArrayList<NcgNode>();
            nodeListSrc_ = nodeList_;
            nodeListSink_ = nodeList_;
        }
        nodeListSink_.add(node);
    }

    @SuppressWarnings("unchecked")
    // Any way to avoid this?
    public <N extends NcgNode> N getNode(int n) {
        if ((nodeList_ == null) || (n >= nodeList_.size()))
            return null;
        // causes unchecked warning:
        return (N) nodeListSrc_.get(n);
    }
}

class DcgNode extends NcgNode {
    // enables DCG algorithms, etc
}

class DagNode extends DcgNode {
    // enables DAG algorithms, etc.
}

有没有更好的方法来设计这个?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-19 09:59:46

如下所示修改你的方法:

代码语言:javascript
复制
public NcgNode getNode(int n) {
  if ((nodeList_ == null) || (n >= nodeList_.size())) {
  return null;
}

return (NcgNode) nodeListSrc_.get(n);
} 
票数 0
EN

Stack Overflow用户

发布于 2012-12-19 10:22:29

只需让你的列表具有NcgNode类型,例如

代码语言:javascript
复制
private List<NcgNode> nodeListSrc_ = null;

您仍然可以将NcgNode的子类放入这些列表中。

票数 1
EN

Stack Overflow用户

发布于 2012-12-19 18:31:16

您应该这样做,如下所示。在抽象类(NcgNode)中定义方法,并根据子类的类型进行参数化。因此,可以很容易地编写addNodegetNode。然后,您将拥有特定的实现(我使用了DcgNodeDagNode;不确定这是否是您想要的),它是这个类的子类,并在其自身上参数化。这允许您稍后(见下文)具有要求节点的子节点与该节点的类型相同的算法。

代码语言:javascript
复制
public abstract class NcgNode<N> {
    private List<N> nodeList_ = null;

    public void addNode(N node) {
        if (nodeList_ == null) {
            nodeList_ = new ArrayList<N>();
        }
        nodeList_.add(node);
    }

    // Any way to avoid this?
    public N getNode(int n) {
        if ((nodeList_ == null) || (n >= nodeList_.size()))
            return null;
        return nodeList_.get(n);
    }
}

class DcgNode extends NcgNode<DcgNode> {
    // enables DCG algorithms, etc
}

class DagNode extends NcgNode<DagNode> {
    // enables DAG algorithms, etc.
}

//...
static <N extends NcgNode<N>> void someAlgorithm(N node) { }

您认为DagNodeDcgNode的子类的想法是不安全的,因为如果DagNode“是-a”DcgNode,那么这意味着您可以将任何DcgNode作为它的子类放入其中,这不是您想要的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13944465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档