Java泛型和简单类型

时间:2009-10-24 12:13:24

标签: java generics

我试图写一个泛型类,它可以在任何简单类型(int,float等)上运行。我想避免多次重复相同的功能,改变参数的类型。但由于泛型参数是一个引用,我无法对其类型的变量进行任何计算,例如在C ++模板中。

在Java中有没有简单的方法在泛型类型变量上使用算术运算符?我知道我可以使用类检查和转换,但我认为这将是更多的代码,并对性能产生影响。但是我最近才开始用Java编写,所以我可能错了。

3 个答案:

答案 0 :(得分:3)

对不起,你无法在C ++中这样做。 Java中的泛型与C ++模板的工作方式完全不同。在Java中,只生成一个通用代码版本,并且它必须适用于所有类型参数。因为所有基元在字节代码中具有不同的表示,所以它们不能共享相同的通用代码。这就是为什么只有引用类型是Java中的有效类型参数。

我认为你能得到的最接近的就是使用Number类。 Autoboxing会自动将任何原始数值转换为Number的子类。 E.g:

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 ++方式的类型参数”,并为每个不同类型生成不同版本的代码论证表示。

答案 1 :(得分:2)

一种解决方案可能是使用模板方法:

T foo<T extends Number>( T value )

并使用value.intValue()value.longValue()value.doubleValue()进行计算。

答案 2 :(得分:-1)

Java 1.5应该通过autoboxing

为您处理这个问题