Java中数字类型及其算术运算的建模

Java中数字类型及其算术运算的建模,java,interface,numbers,Java,Interface,Numbers,我想做什么: 我正在创建一个类层次结构,它表示许多线性代数概念,并具有这些概念的实用工具(用于实践线性代数和Java,我现在正在学习)。 一切都很顺利,直到我决定添加不同类型的数字,即整数、有理数、实数和复数(目前) 我想要的是能够使用它们进行操作(例如,在一个矩阵类中),而不必关心我使用的是哪种数字类型,并在代表每种数字类型的不同类中实现所有操作 我的想法/尝试: 我认为制作一个名为“AnyNumber”的接口(因为Number已经被javaapi采用)是一个好主意,在这个接口上定义所有必要的

我想做什么:

我正在创建一个类层次结构,它表示许多线性代数概念,并具有这些概念的实用工具(用于实践线性代数和Java,我现在正在学习)。 一切都很顺利,直到我决定添加不同类型的数字,即整数、有理数、实数和复数(目前)

我想要的是能够使用它们进行操作(例如,在一个矩阵类中),而不必关心我使用的是哪种数字类型,并在代表每种数字类型的不同类中实现所有操作

我的想法/尝试:

我认为制作一个名为“AnyNumber”的接口(因为Number已经被javaapi采用)是一个好主意,在这个接口上定义所有必要的抽象方法,然后在每个Number类型的类上实现该接口。 问题是,我不知道如何处理类类型

下面是接口声明的样子:

public interface AnyNumber {

    public AnyNumber add(AnyNumber other);
    public AnyNumber subtract(AnyNumber other);
    public AnyNumber multiply(AnyNumber other);
    public AnyNumber divide(AnyNumber other);

}
这样,我就可以通过简单的调用方法来操作实现接口的任何对象,如:

number1 = number1.add(number2)

我遇到的问题

当试图在特定类上实现接口方法时,就会出现问题。
我认为Java理解类型“AnyNumber”可以是实现接口的任何类型,因此我尝试声明如下方法:

public IntegerNumber add(IntegerNumber other) {
    return new IntegerNumber(this.value + other.value);
}
但是Eclipse抱怨我没有实现以下方法:

AnyNumber add(AnyNumber other)
然后我认为我可以将返回和参数类型更改为“AnyNumber”,但很快意识到我无法访问“other”中的变量“value”,因为接口没有定义它

所以我想也许我需要一个抽象类,为所有不同类型的数定义所有必要的字段和抽象方法,但我不确定这是否是一个好方法,因为整数只需要一个字段,而有理数需要两个,复数也需要两个,但我想给它们命名不同。另外,有些东西一直告诉我,在这种情况下,接口非常有意义

所以我想也许我需要的是泛型。但我还没有完全理解它们,我用它们来解决这个问题的所有尝试都失败了

请帮忙

我意识到我无法独自解决这个问题。。。我真的很想继续这个项目,学习如何用Java处理这种情况


非常感谢你的帮助

实现接口方法时,参数类型需要与接口中的参数类型完全相同。返回类型不必相同——它可以是一个子类(这称为协方差)。但是参数类型不能是子类(这称为逆变,Java不允许)

原因是没有什么可以阻止两个
AnyNumber
对象的类型不同

AnyNumber n1 = new IntegerNumber(123);
AnyNumber n2 = new RealNumber(23.4);
然后,你可以说:

IntegerNumber n3 = n1.add(n2);
或者您可以将
n1
n2
作为参数传递给尝试执行上述操作的其他方法。这里的要点是,由于
n1
n2
被声明为
AnyNumber
,编译器此时无法判断这两个对象是否具有相同的类

这意味着,如果您要求两个对象具有相同的类,则必须在运行时自己强制执行

您的实现类需要如下所示

public class IntegerNumber implements AnyNumber {

    public IntegerNumber add(AnyNumber other) {  // NOTE: Must be AnyNumber!!
        IntegerNumber otherInteger = (IntegerNumber)other;
            // will throw a ClassCastException at runtime if "other" is, say, RealNumber
        ...
    }
}

该方法的其余部分可以使用
otherInteger
,因为您已经检查过了,编译器知道此时它将是一个
IntegerNumber
。你还可以做其他事情;您可以使用
instanceof
来检查和控制您引发的异常(或您执行的其他操作),而不是让强制转换引发异常。如果您愿意,还可以添加机制来处理添加不同的
AnyNumber
类型。

我明白了。所以我可以使用“instanceof”来处理不同类型的数字之间的操作,检查另一个数字是什么类型的,然后对其进行类型转换,对吗?谢谢你的帮助@阿德里亚里科布朗斯并不完全如此。如果它是
实数
(即,如果对象是使用
新实数
创建的),则不能将其强制转换为
整数。您也不能将
整数编号
强制转换为
实数
。要处理
整数编号
实数
添加
,您必须弄清楚该怎么做(可能将整数的
转换为浮点);要添加一个
整数编号
和一个
理性编号
,您需要做一些数学运算。我知道我知道,我的意思是“然后将其键入正确的类型(并以正确的方式处理每种情况)”,对不起!