通用数字的算术

Jem*_*nes 0 java generics

因此,我必须接受泛型类型 T,它将作为数字基元之一的包装类,并用它进行一些算术运算。我认为这会很简单,因为自动装箱和拆箱:

T newval = val1*val2;
Run Code Online (Sandbox Code Playgroud)

(其中 val1 和 val2 已经是 T 类型的变量,其中包含适当的值。)

但事实证明,如果 Java 在编译时不明确知道类型,则它不会拆箱值。我还认为我可以使用每个 Number 子类(我打算使用)中的乘法方法。所以我用以下方式声明了我的课程:

public class SomeClass<T extends Number> {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

进而:

T newval = val1.multiiply(val2);
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为我猜并不是所有 Number 的子类都需要(为什么他们不为此使用接口?)来拥有该方法(但我想使用 DO 的所有子类。)

我见过一些类似的问题,但它们都导致OP被告知不要使用泛型,但我需要在我正在做的工作中使用泛型,否则整个事情就没有价值了。有人能想到一个对我有用的解决方案吗?

编辑: 好的,所以他回复我并澄清了意思,它足够不同,我的问题不再与我正在做的事情相关。多谢你们。

Sot*_*lis 5

各种算术运算符只能应用于可转换为基本类型的类型的值。无法用泛型来表达该要求。因此泛型不适合这项任务。

对于泛型方法,请改为提供数字基元类型的重载。对于泛型类,提供使用特定数字类型的子类。

class NumericCalculator<T> {
    public void calculate(T one, T two) {
        T result = one * two; // compiler error
    }
}

class LongCalculator extends NumericCalculator<Long> {
    public void calculate(Long one, Long two) {
        Long result = one * two; // yes
    }
}
Run Code Online (Sandbox Code Playgroud)

使用运算符的实现必须位于知道实际类型的子类中。