具有原始数据类型的 Java 模板作为 C++ 模板

标签 java templates

我想像在 C++ 中一样使用模板/泛型在 Java 中实现一个函数。我尝试在 Java 中使用具有原始值(int、double 等)的泛型,但是对于下面的函数均值,我从编译器中得到以下错误:

error: bad operand types for binary operator '+' sum += value; first type: double second type: T where T is a type-variable: T extends Object declared in method mean(T[])

我尝试用其他值替换 T,但找不到答案。正确的做法是什么?

// Java code
private <T> double mean(T[] data) {
    double sum = 0;
    for (T value : data)
        sum += value;

    return sum / data.length;
}

最佳答案

简单地说:你不能。

与 C++ 模板相比; Java 泛型适用于引用,也就是“对象”类型。不,没有办法解决这个问题。

这里的关键是:Java 泛型与 C++ 模板是一回事。

在 C++ 方面,编译器实际上是从您的模板中创建特定于类型的代码。对于 java,泛型(不过是)语法糖 围绕采用Object 参数的方法。换句话说:编译器进行所有转换,使其看起来像您的 List<String>真的只适用于字符串。但是 List<String> 没有特殊/不同的编译单元或 List<Integer> .只有一个 List.class 可以在所有地方使用 Object。

所以基本的答案是:两个概念在两种不同的编程语言中在句法上看起来是相同的这一事实......并不能使它们在语义上相同。

记录在案:正如其他答案所建议的那样,您可以使用类似 <T extends Number> 的内容另一剂语法糖(称为自动装箱和拆箱)开始发挥作用。但要注意后果:自动装箱基本上转化为:中间 Long、Integer 等对象的创建。换句话说:广泛使用,会对性能产生主要影响(例如,在处理具有原始值的非常大的数组时);因为没有什么比创建大量立即变成“垃圾”(并因此触发 GC Activity !)的对象“更糟糕”的了!

关于具有原始数据类型的 Java 模板作为 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41060384/

相关文章:

c++ - 错误 : expected primary-expression before ‘>’ : templated function that try to uses a template method of the class for which is templated

c++ - 非模板类的模板子类 - 未解析的外部

c++ - 如何延迟初始化unique_ptrs的模板元组?

java - slf4j 总是使用 NOPMDCAdapter

css - 尽管样式为 ="clear:both",但 div 重叠页脚?

c++ - 自动推导返回和参数类型的仿函数

java - 保证键唯一时 HashMap 的性能

java - 如何使用 JAVA 以编程方式为事件中心创建消费者组?

java - java 编程时出错

java - 通过 JDBC 的 Postgres 连接 : org. postgresql.util.PSQLException: ERROR: relation "prescriptions"does not exist