可以使用不同的Number返回类型覆盖接口方法吗?

时间:2017-06-30 01:33:48

标签: java data-structures hashcode

我有一个数据结构实验室,老师问我"创建类IpAddressValueHasher实现Hasher'所以当你 override hash(IpAddress)它返回参数&的一个Long对象 ipValue调用hashCode。 问题是我不知道如何覆盖返回long的方法接口(返回一个int)。

任何帮助或指示都会非常感谢

public class IpAddressValueHasher implements Hasher<IpAddress> {
    @Override
    public long hash(IpAddress ip) { //error on this line, can't return long
        long ipValue = ip.getIpValue();
        return ipValue;
    }
}


public class IpAddress //new class
{   
    private long ipValue=0;
    private String dottedDecimal="0.0.0.0";

    public IpAddress(){}

    public IpAddress(String dec)
    {
        setDottedDecimal(dec);
    }

    public boolean setDottedDecimal( String s )
    {
        if( s==null || s.length() == 0 )
            return false;
        dottedDecimal = s;
        ipValue = 0;
        String [] tokens = s.split("[.]");
        for( String tok : tokens ){
            int subVal = Integer.parseInt(tok);
            ipValue  =  ipValue * 256 + subVal;
        } // end for
        return true;
    }

    public long getIpValue(){ return ipValue; }

    public String getDottedDecimal(){ return dottedDecimal; }

    public String toString(){ return dottedDecimal  + ", " + Long.toHexString(ipValue); }
} // end class IpAddress

public interface Hasher<E> {
    public int hash(E elem);
}

1 个答案:

答案 0 :(得分:2)

首先,协变返回类型不适用于原始数据类型。通过协变返回类型,我们的意思是返回类型可以在与子类相同的方向上变化。这意味着当我们重写方法时,该方法的返回类型可以是重写方法的返回类型的子类型。例如 -

    public class A {
        public Object method() {return null;}
    }
    public class B extends A {
        @Override
        public String method() {return "";}
    }

在您的情况下,您可以进行以下更改:

    public class IpAddressValueHasher implements Hasher<IpAddress> {
         @Override
         public Long hash(IpAddress ip) { // This line 
             long ipValue = ip.getIpValue();
             return ipValue;
         }
    }
    interface Hasher<E> {
         public Number hash(E elem); // This line
    }