我想使用模板/泛型在 Java 中实现一个函数,就像我在 C++ 中所做的那样。我尝试在 Java 中使用具有原始值(int、double、...)的泛型,但是对于下面的函数 mean 我从编译器中得到以下错误:
错误:二元运算符 '+' sum += value 的错误操作数类型;第一种类型:double 第二种类型:T 其中 T 是类型变量:T extends Object 在方法 mean(T[]) 中声明
我尝试将 T 替换为不同的值,但找不到答案。正确的做法是什么?
// Java code
private <T> double mean(T[] data) {
double sum = 0;
for (T value : data)
sum += value;
return sum / data.length;
}
Run Code Online (Sandbox Code Playgroud)
简单地说:你不能。
与 C++ 模板相反;Java 泛型仅适用于引用又名“对象”类型。不,没有办法解决这个问题。
这里的关键是:Java泛型是不是同样的事情,C ++模板。
在 C++ 方面,编译器确实从您的模板中创建了特定于类型的代码。对于 Java,泛型是(不超过)围绕采用Object参数的方法的语法糖。换句话说:编译器完成所有的转换,所以看起来你真的只对字符串有效。但是or没有特殊/不同的编译单元。只有一个 List.class 可以在所有地方与 Object 一起使用。List<String>List<String>List<Integer>
所以基本的答案是:两个概念在两种不同的编程语言中在语法上看起来相同的事实......并不使它们在语义上相同。
作为记录:正如另一个答案所暗示的那样,您可以使用类似的东西,<T extends Number>并且另一种语法糖(称为自动装箱或拆箱)开始起作用。但要注意后果:自动装箱基本上转化为:创建中间Long, Integer, ... 对象。换句话说:广泛使用,可能会对性能产生重大影响(例如,在处理具有原始值的非常大的数组时);因为没有什么比创建大量立即变成“垃圾”的对象(从而触发 GC 活动!)
| 归档时间: |
|
| 查看次数: |
446 次 |
| 最近记录: |