调用

时间:2015-10-10 00:50:51

标签: java interface override

我试图调用一个从接口类重写的除法方法。所有类似的方法(加,减,乘)都可以正常工作,除非由于某些原因找不到除法。以下是我的内容:

算术接口类

public interface Arithmetic {

    public Object add(Object obj);

    public Object subtract(Object obj);

    public Object multiply(Object obj);

    public Object divide(Object obj);
}

数字类(算术方法在下面被覆盖,除以最后一个)

public class Number implements Comparable,Arithmetic{
    /**
     * A string representing a non-negative number
     */
    private String value;
    /**
     * An integer greater than or equals to 2.
     */
    private int base;

    /**
     * - for negative numbers and otherwise null
     */
    private char sign;

    /**
     * creates 0 base 2.
     */
    public Number()
    {
        value = "0";
        base = 2;
    }

    /**
     * creates a number in a specified based using the specified parameters.
     * @param num a string representing a non-negative number with digit
     * written in uppercase letters.
     * @param radix the base of the number
     */
    public Number(String num, int radix) throws InvalidNumberException
    {
        String list = ".-0123456ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        Boolean pars = false;
        for (int i = 0; i < list.length(); i++) {
            if (num.indexOf(list.charAt(i)) != -1) {
                pars = true;
            }
        }
        if (radix < 1 || radix > 35) {
            throw new InvalidNumberException("Number invoked with a radix less than 1 or greater than 35.");
        } else if ((num.indexOf(".") != num.lastIndexOf(".")) || (num.indexOf("-") != num.lastIndexOf("-"))) {
            throw new InvalidNumberException("Number invoked with more than one dash or period in string.");
        } else if (num.indexOf("-") != 0) {
            throw new InvalidNumberException("Number invoked with dash not at beginning of string.");
        } else if (num.indexOf(".") == num.length()) {
            throw new InvalidNumberException("Number invoked with period at end of string.");
        }
        else if (pars == true) {
            throw new InvalidNumberException("Number invoked with invalid character.");
        }
        Boolean test=false;
        for (int i = 0; i < num.length(); i++) {
            if ((num.charAt(i) != '-') || (num.charAt(i) != '.')) {
                if (toValue(num.charAt(i)) >= radix) {
                    test=true;
                    throw new InvalidNumberException("Number invoked with digit greater or equal to radix.");
                }
            }
        }
        if(test==false){
            value = num;
            base = radix;
        } 
    }    

    /**
     * Converts a digit to its integer equivalent
     * @param digit 0...9 or A...Z to be converted
     * @return the integer equivalent of the specified digit.
     */  
    private int toValue(char digit)
    {
        return Character.getNumericValue(digit);
    }

    /**
     * Converts this integer to its equivalent digit
     * @param anInt an integer between 0-35
     * @return the digit equivalent to an integer
     */
    private char toDigit(int anInt)
    {        
        if(anInt >= 0 && anInt <= 9)
            return (char)(anInt + 48);

        else if(anInt >= 10 && anInt <= 35)
            return (char)(anInt + 55);

        else
            return (char)(-1);
    }

    /**
     * converts a number to its decimal equivalent (double).
     * @return the decimal equivalent of a number
     */
    private double toDouble()
    {
        if (base == 10)
            return Double.parseDouble(value);
        int periodIndex = value.indexOf('.');
        double base10Num = 0;
        int i;
        int radix = base;
        String whole;
        if (periodIndex >=0)
            whole = value.substring(0, periodIndex);
        else
            whole = value;
        int j=0;
        int wholeLength = whole.length();
        for (i=wholeLength-1; i>=0; i--)
            base10Num = base10Num + toValue(whole.charAt(i))*(int)Math.pow(radix,wholeLength-i-1);
        if (periodIndex >= 0)
        {            
            String fract = value.substring(periodIndex+1,value.length());
            int fractLength = fract.length();
            for (i=0; i<fractLength; i++)
            {
                base10Num = base10Num + toValue(fract.charAt(i))*Math.pow(radix,-i-1);
            }
        }      
        if (sign == '-')
            base10Num *= -1;
        return base10Num;
    }

    /**
     * converts a decimal number (double) to its equivalent representation
     * in a given base.
     * @param dec the decimal (base 10) number
     * @radix the base to convert the number to.
     * @return the equivalent number in the specified base
     */    
    private Number doubleToNumber(double dec, int radix)
    {
        if (radix == 10)
            return new Number(Double.toString(dec),radix);
        String numSign="";
        if (dec < 0)
        {
            numSign = "-";
            dec = -dec;
        }
        int whole = (int)dec;
        double fract = dec - whole;
        String numStr = "";
        while (whole != 0)
        {
            numStr = toDigit(whole%radix) + numStr;
            whole = whole / radix;
        }
        if (fract != 0)
        {
            numStr += ".";        
            int tolerance = 20;        
            int precision = 0;        
            while (precision < tolerance && fract != 0)        
            {
               fract = fract * radix;
               numStr += toDigit((int)(fract));
               precision++;
               fract = fract - (int)fract;               
            }
        }
        return new Number(numSign+numStr,radix);
    }

    /**
     * Gives a string representation of this number in the
     * format number[base].
     * @return a string representation of this number
     */
    @Override
    public String toString()
    {
        return String.format("%s%s[%d]", this.sign, this.value, this.base);
    }   

    @Override
    public boolean equals(Object obj)
    {
        if (!(obj instanceof Number))
            return false;
        return (this.toDouble()==((Number)obj).toDouble()); 
    }

    @Override
    public int compareTo(Object obj) throws IllegalArgumentException
    {
        if (!(obj instanceof Number))throw new IllegalArgumentException();
        else if(this.toDouble()<((Number)obj).toDouble()) return -1;
        else if(this.toDouble()>((Number)obj).toDouble()) return 1;
        else return 0;
    }

    /**
     * This method adds two numbers from two different objects
     * @param obj the number of the object inputted from user
     * @return a new added number object
     */

    @Override
    public Object add(Object obj) throws IllegalArgumentException {
        if (!(obj instanceof Number)) {
            throw new IllegalArgumentException();
        } else if (this.base != ((Number) obj).base) {
            throw new IllegalArgumentException();
        } else {
            return doubleToNumber((this.toDouble() + ((Number) obj).toDouble()), ((Number) obj).base);
        }
    }

   /**
    * This method subtracts two numbers from two different objects
    * @param obj the number of the object inputted from user
    * @return a new subtracted number object
    */

    @Override
    public Object subtract(Object obj) throws IllegalArgumentException {
        if (!(obj instanceof Number)) {
            throw new IllegalArgumentException();
        } else if (this.base != ((Number) obj).base) {
            throw new IllegalArgumentException();
        } else {
            return doubleToNumber((this.toDouble() - ((Number)obj).toDouble()), ((Number) obj).base);
        }
    }

    /**
     * This method multiplies two numbers from two different objects
     * @param obj the number of the object inputted from user
     * @return a new multiplied number object
     */

    @Override
    public Object multiply(Object obj) throws IllegalArgumentException{
        if (!(obj instanceof Number)) {
            throw new IllegalArgumentException();
        } else if (this.base != ((Number) obj).base) {
            throw new IllegalArgumentException();
        } else {
            return doubleToNumber(this.toDouble() * ((Number)obj).toDouble(), ((Number) obj).base);
        }
    }


   /**
    * This method divides two numbers from two different objects
    * @param obj the number of the object inputted from user
    * @return a new divided number object
    */

    @Override
    public Object divide(Object obj) throws IllegalArgumentException {
        if (!(obj instanceof Number)) {
            throw new IllegalArgumentException();
        } else if (this.base != ((Number) obj).base) {
            throw new IllegalArgumentException();
        } else if (((Number) obj).toDouble() == 0) {
            throw new IllegalArgumentException();
        } else {
            return doubleToNumber((this.toDouble() / ((Number) obj).toDouble()), ((Number) obj).base);
        }
    }

}

最后是我的演示类,NumberDemo

public class NumberDemo 
{
    public static void main(String[] args) 
    {
        Number a = new Number("12.25", 8);
        Number b = new Number("13.75", 8);

        System.out.println(a.toString() + " + "  + b.toString() + " = " + 
                           a.add(b));

        a = new Number("ABC.75", 16);
        b = new Number("18.5F", 16);
        Number c = new Number("2.FB", 16);

        System.out.println("(" + a.toString() + " - " + b.toString() + ") / " +
                           c.toString() + " = " + (a.subtract(b)).divide(c));

        a = new Number("3.45", 9);
        b = new Number("32.25", 9);
        c = new Number("3.05", 9);

        System.out.println(a.toString() + "(" + b.toString() + " + " +
                           c.toString() + " = " + a.multiply(b.add(c)));

        a = new Number("10111.11", 2);
        b = new Number("1100110.01", 2);
        c = new Number("-101", 2);

        System.out.println("(" + a.toString() + " - " + b.toString() + ") / " +
                           c.toString() + " = " + (a.subtract(b)).divide(c));

        a = new Number("-5", 8);
        b = new Number("5", 8);

        System.out.println(a.toString() + " x " + b.toString() + " = " + 
                           a.multiply(b));

        a = new Number("-0.5", 8);
        b = a;

        System.out.println(a.toString() + " x " + b.toString() + " = " + 
                           a.multiply(b));
    }
}

当我调用所有算术方法时,它们似乎被调用得很好,但是调用除法会给我带来错误工具提示:

cannot find symbol
    symbol: method divide(Number)
    location: class Object

我似乎无法找到原因,有人能发现吗?

这是我第一次使用Stockoverflow,所以如果有什么不符合格式规范,请告诉我。

0 个答案:

没有答案