gpt4 book ai didi

java - 在 Java 中建模数字类型和它们之间的算术运算

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:26 28 4
gpt4 key购买 nike

我正在尝试做的事情:

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

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

我的想法/尝试:

我认为创建一个名为“AnyNumber”的接口(interface)(因为 Number 已被 Java API 使用)是个好主意,我会在该接口(interface)上定义所有必要的抽象方法,然后在每个数字类型上实现该接口(interface)类(class)。问题是,我不知道如何处理类类型。

这是接口(interface)声明的样子:

public interface AnyNumber {

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

}

这样,我就可以通过简单的调用方法对任何实现该接口(interface)的对象进行操作,例如:

number1 = number1.add(number2)


我遇到的问题

当尝试在特定类上实现接口(interface)方法时就会出现问题。
我认为 Java 理解类型“AnyNumber”可以是实现该接口(interface)的任何类型,所以我尝试这样声明方法:

public IntegerNumber add(IntegerNumber other) {
return new IntegerNumber(this.value + other.value);
}

但是Eclipse报错说我没有实现下面的方法:

AnyNumber add(AnyNumber other)

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

所以我想也许我需要的是一个抽象类,它为所有不同类型的数字定义了所有必要的字段和抽象方法,但我不确定这是否是一种好方法,因为整数只需要一个字段,虽然有理数需要两个,而复杂的也需要两个,但我想给它们取不同的名字。此外,有些事情一直告诉我,在这种情况下,接口(interface)很有意义。

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

请帮忙

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

非常感谢您的帮助!

最佳答案

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

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

AnyNumber n1 = new IntegerNumber(123);
AnyNumber n2 = new RealNumber(23.4);

然后,你可以说:

IntegerNumber n3 = n1.add(n2);

或者您可以将 n1n2 作为参数传递给尝试执行上述操作的其他方法。这里的要点是,由于 n1n2 被声明为 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 类型。

关于java - 在 Java 中建模数字类型和它们之间的算术运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27338589/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com