如何将Fraction对象强制转换为Double对象?

时间:2016-04-07 11:36:33

标签: java casting

当我学习Android时,我可以将对象类型转换为其他类型,如下所示:

TextView txtHello = (TextView) view;

其中view定义为View,我认为原因是TextViewView的子类。现在,我有一个Fraction类,其内容如下:

public class Fraction {

    private int numerator;
    private int denominator;

    public Fraction() {
        numerator = 0;
        denominator = 1;
    }

    public Fraction(int value) {
        numerator = value;
        denominator = 1;
    }

    public Fraction(int numerator, int denominator) throws ArithmeticException {
        if (denominator == 0) {
            throw new ArithmeticException("Denominator can not be 0!");
        }
        if (denominator < 0) {
             denominator *= -1;
             numerator *= -1;
        }
        this.numerator = numerator;
        this.denominator = denominator;
        this.simplify();
    }

    public double toDouble() {
        return (double) numerator / (double) denominator;
    }

    @Override
    public String toString() {
        return String.format("%d/%d", numerator, denominator);
    }

    public int getNumerator() {
        return numerator;
    }

    public int getDenominator() {
        return denominator;
    }

    private void simplify() {
        int x = getGreatestCommonDivisor(numerator, denominator);
        numerator /= x;
        denominator /= x;
    }

    private int getGreatestCommonDivisor(int x, int y) {
        x = x < 0 ? -x : x;
        y = y < 0 ? -y : y;
        if (x == 0 || y == 0) {
            return x + y;
        }
        while (x != y) {
            if (x > y) {
                x = x - y;
            } else {
                y = y - x;
            }
        }
        return x;
    }
}

当我创建一个新的分数时:

Fraction frac = new Fraction(2, 5);

这两行都是错误:

Double d1 = (Double) frac;
double d2 = (double) frac;

我知道我可以通过调用Fraction方法将double转换为toDouble。但我想知道如何做我在Android中所知道的。我尝试Fraction extends Double,但Doublefinal类。如果我创建一个新类Double,我如何在上面执行任何行代码,而d1d2真的是frac的值?

2 个答案:

答案 0 :(得分:2)

你不能演员,因为他们是不相关的类型。

使用引用类型(例如FractionDouble),转换实际上并没有构建一个新的转换类型实例 - (Double) frac只是对编译器& #34;相信我,我知道这个Fraction真的是Double,让我用它作为一个&#34;。

但是,编译器知道Double的继承层次结构中Fraction并不存在,因此它知道对Fraction的引用不可能真正成为Double一个Fraction,所以它禁止演员。

但您有一种方法可以将double转换为double d2 = frac.toDouble();

root/build.gradle

答案 1 :(得分:1)

  

如果我创建一个新类为Double,我怎么能在上面做任何行代码,d1和d2真的是frac的值?

在Java中,你无法在不破坏核心库的情况下做到这一点,这是你不应该做的事情。

您可以做的是扩展Number,它是Double的父级。

Number num = new Fraction(2, 3); // if Fraction extends Number
Number d = 1.33;