因此,我必须接受泛型类型 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被告知不要使用泛型,但我需要在我正在做的工作中使用泛型,否则整个事情就没有价值了。有人能想到一个对我有用的解决方案吗?
编辑: 好的,所以他回复我并澄清了意思,它足够不同,我的问题不再与我正在做的事情相关。多谢你们。
各种算术运算符只能应用于可转换为基本类型的类型的值。无法用泛型来表达该要求。因此泛型不适合这项任务。
对于泛型方法,请改为提供数字基元类型的重载。对于泛型类,提供使用特定数字类型的子类。
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)
使用运算符的实现必须位于知道实际类型的子类中。
| 归档时间: |
|
| 查看次数: |
547 次 |
| 最近记录: |