继承和泛型

ggc*_*des 5 java generics inheritance

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

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

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.
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来设计它?

Syn*_*ror 0

修改您的方法如下:

public NcgNode getNode(int n) {
  if ((nodeList_ == null) || (n >= nodeList_.size())) {
  return null;
}

return (NcgNode) nodeListSrc_.get(n);
} 
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案不允许调用者在不执行不安全转换的情况下使用它返回的具体子类的细节。把罐子踢到路边。 (3认同)