JAVA - 多态性问题

时间:2016-02-25 05:52:03

标签: java polymorphism method-overriding

作为家庭作业,我正在创建一个实现Node接口的SingleLinkedNode类。

节点接口

 public interface Node <T> {

    static final String NULL_NODE_ERROR = "Node can't be null";

    public void setNextNode(Node nextNode) throws NullPointerException;
    public void setIndex(int index);
    public int getIndex();
    public T getData();
    public Node getNextNode();

   }

SingleLinkedNode类

public class SingleLinkedNode<T> implements Node<T> {

    private int index;
    private T data;
    private SingleLinkedNode nextNode;

    public SingleLinkedNode() {
    }

    public SingleLinkedNode(int index) {
        this.index = index;
    }

    public SingleLinkedNode(int index, SingleLinkedNode nextNode) {
        this.index = index;
        this.nextNode = nextNode;
    }

    @Override
    public void setNextNode(SingleLinkedNode nextNode) throws NullPointerException{
        if (nextNode == null){
            throw new NullPointerException(NULL_NODE_ERROR);
        }

        this.nextNode = nextNode;
    }

    @Override
    public void setIndex (int index){
        this.index = index;
    }

    @Override
    public int getIndex() {
        return this.index;
    }

    @Override
    public T getData() {
        return this.data;
    }

    @Override
    public SingleLinkedNode getNextNode() {
        return this.nextNode;
    }

}

在类的setNextNode(SingleLinkedNode nextNode)方法中,它表示即使SingleLinkedNode实现Node,我也没有实现接口的setNextNode(Node nextNode)方法。

但是,如果我将类方法完全保留为接口,那么就说Node不能转换为SingleLinkedNode,这很明显。

是否有任何正确的方法来覆盖此方法并确保该方法仅接受SingleLinkedNode对象作为参数?

我考虑过施法,但我不确定这是否正确。

1 个答案:

答案 0 :(得分:0)

谢谢所有解决方案如下

@Override
    public void setNextNode(Node nextNode) throws NullPointerException, IllegalArgumentException{
        if (nextNode == null){
            throw new NullPointerException(NULL_NODE_ERROR);
        }
        if ( ! (nextNode instanceof SingleLinkedNode) ) {
            throw new IllegalArgumentException ("Node is not SingleLinkedNode");
        }

        this.nextNode = (SingleLinkedNode) nextNode;
    }