作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图编写一个通用类,它可以对任何简单类型(int、float 等)进行操作。我想避免通过更改参数类型多次重复相同的功能。但是由于泛型参数是一个引用,我无法对其类型的变量进行任何计算,就像在 C++ 模板中一样。
那么在Java中有什么简单的方法可以对泛型类型变量使用算术运算符吗?我知道我可以使用类检查和转换,但我认为这会增加更多代码,并且会影响性能。然而,我最近才开始用 Java 编写,所以我可能是错的。
最佳答案
抱歉,无法像在 C++ 中那样执行此操作。 Java 中的泛型与 C++ 模板的工作方式完全不同。在 Java 中,只会生成一个版本的泛型代码,并且它必须适用于所有类型的参数。因为所有原语在字节码中都有不同的表示,所以它们不能共享相同的通用代码。这就是为什么在 Java 中只有引用类型才是有效的类型参数。
我认为最接近的方法是使用 Number
类。自动装箱会自动将任何原始数值转换为 Number
的子类。例如:
class Foo<T extends Number> {
public void operate(T number) {
double value = number.doubleValue();
// do something with the double
}
}
Foo<Integer> intFoo = new Foo<Integer>();
intFoo.operate(666);
intFoo.operate(666.0); // fails to compile
但是类型参数并不能真正让你买账。如果您希望 operate
方法返回 T 类型的值,则必须求助于运行时检查,这与目的背道而驰。
一个可能有趣的旁注:Scala 2.8将支持注释 @specialize
,它基本上告诉编译器“以 C++ 方式处理类型参数”,并为每个不同的类型参数表示生成不同版本的代码。
关于Java 泛型和简单类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1617843/
我是一名优秀的程序员,十分优秀!