当我学习Android时,我可以将对象类型转换为其他类型,如下所示:
TextView txtHello = (TextView) view;
其中view
定义为View
,我认为原因是TextView
是View
的子类。现在,我有一个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
,但Double
是final
类。如果我创建一个新类Double
,我如何在上面执行任何行代码,而d1
和d2
真的是frac
的值?
答案 0 :(得分:2)
你不能演员,因为他们是不相关的类型。
使用引用类型(例如Fraction
和Double
),转换实际上并没有构建一个新的转换类型实例 - (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;