【问题标题】:java interface avoid castingjava接口避免强制转换
【发布时间】:2017-11-10 22:24:33
【问题描述】:

我有两节课。实现“Node”的接口类“Node”和“Nodegraph”。 “节点”有一个参数方法,添加,我使用节点节点作为参数。在 NodeGraph 中,我需要转换 (NodeGraph) 节点才能使用 NodeGraph 对象。有没有更好的方法来避免强制转换?

import java.util.Set;

public interface Node {
    public String getId();
    public void add(Node node);
    public boolean remove(Node node);
}


import java.util.Iterator;
import java.util.LinkedList;

public class NodeGraph implements Node {

    private int row;
    private int column;
    private String id;
    private LinkedList<NodeGraph> neighbourds = new LinkedList<NodeGraph>();

    public NodeGraph(int row, int column) {
        this.row = row;
        this.column = column;
        id = "" + row + column;
    }

    @Override
    public String getId() {
        return id;
    }

    @Override
    public void add(Node node) {
        neighbourds.add((NodeGraph) node);
    }

    @Override
    public boolean remove(Node node) {
        return neighbourds.remove((NodeGraph) node);
    }

}

【问题讨论】:

    标签: java interface casting implements


    【解决方案1】:

    我假设您有充分的理由将 neighbourds 列表绑定到 NodeGraph 类型。 如果是这样,您可以通过参数化 Node 接口来避免强制转换:

    public interface Node< T extends Node<T> > {
        public String getId();
        public void add(T node);
        public boolean remove(T node);
    }
    
    public class NodeGraph implements Node<NodeGraph> {
    
        private int row;
        private int column;
        private String id;
        private LinkedList<NodeGraph> neighbourds = new LinkedList<NodeGraph>();
    
        public NodeGraph(int row, int column) {
            this.row = row;
            this.column = column;
            id = "" + row + column;
        }
    
        @Override
        public String getId() {
            return id;
        }
    
        @Override
        public void add(NodeGraph node) {
            neighbourds.add(node);
        }
    
        @Override
        public boolean remove(NodeGraph node) {
            return neighbourds.remove(node);
        }
    }
    

    【讨论】:

    • 避免强制转换是否有任何性能优势?我在 Scala 中看到过这种模式,你能推荐一些好的资源来研究 Java 的类型边界吗?
    【解决方案2】:

    发生这种情况是因为您 neighbourds 列表是不变的,这意味着您只能插入参数化类型,在这种情况下为 NodeGraph,将列表定义为与 Node 协变将允许您添加任何子类Node:

    private LinkedList<? extends Node> neighbourds = new LinkedList<>();
    

    【讨论】:

      【解决方案3】:

      您应该使用接口声明neighbors 列表(对于ListNode):

      private List<Node> neighbourds = new LinkedList<>();
      

      【讨论】:

      • 谢谢,但是当我更改 private LinkedList neighbourds = new LinkedList(); 时出现错误在私有 List 邻居 = new LinkedList();或者我没有得到你的帮助
      • 似乎是什么错误?我只能假设它与“钻石”运算符有关,并且您的项目的语言级别为 1.6 或以下)。如果是这样,请使用new LinkedList&lt;Node&gt;() 或(更好)升级到 java8。另请注意,您必须导入 java.util.List 才能使其正常工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多