Java泛型和简单类型

Java泛型和简单类型,java,generics,Java,Generics,我试图编写一个泛型类,它可以对任何简单类型(int、float等)进行操作。我希望通过更改参数的类型来避免多次重复相同的函数。但由于泛型参数是引用,所以我不能对其类型的变量进行任何计算,如C++模板。 那么,Java中有没有简单的方法在泛型类型变量上使用算术运算符呢?我知道我可以使用类检查和强制转换,但我认为这会带来更多的代码,并对性能产生影响。但是,我最近才开始用Java编写,所以我可能错了。Java 1.5应该通过为您处理此问题,Java 1.5应该通过为您处理此问题,一个解决方案可能是使用

我试图编写一个泛型类,它可以对任何简单类型(int、float等)进行操作。我希望通过更改参数的类型来避免多次重复相同的函数。但由于泛型参数是引用,所以我不能对其类型的变量进行任何计算,如C++模板。


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

Java 1.5应该通过为您处理此问题,Java 1.5应该通过为您处理此问题,一个解决方案可能是使用模板方法:

T foo<T extends Number>( T value )
T foo(T值)

并使用
value.intValue()
value.longValue()
value.doubleValue()
,一种解决方案是使用模板方法:

T foo<T extends Number>( T value )
T foo(T值)

< >使用<代码>值> ItValue\(/>代码>、<代码>值>长值()/<代码>、代码>值、双值()/代码> ./P> < P> > 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
class-Foo{
公用电话(T号码){
double value=number.doubleValue();
//用双人床做点什么
}
}
Foo intFoo=新的Foo();
intFoo.operate(666);
intFoo.操作(666.0);//未能编译
但是类型参数并没有给您带来多少好处。如果您想让
operate
方法返回类型为T的值,则必须求助于运行时检查,这类检查无法达到目的


一个可能有趣的旁注:将支持注释<代码> @专门化,它基本上告诉编译器“处理C++ C++中的类型参数”,并为每个不同类型的参数表示生成不同版本的代码。

< P> > 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
class-Foo{
公用电话(T号码){
double value=number.doubleValue();
//用双人床做点什么
}
}
Foo intFoo=新的Foo();
intFoo.operate(666);
intFoo.操作(666.0);//未能编译
但是类型参数并没有给您带来多少好处。如果您想让
operate
方法返回类型为T的值,则必须求助于运行时检查,这类检查无法达到目的


一个可能有趣的旁注:将支持注释<代码> @专门化,它基本上告诉编译器“处理C++的类型参数”,并为每个不同类型的参数表示生成不同版本的代码。如果定义了一个方法

tfoo(T值)
,则不能执行任何算术运算。自动装箱在这里没有帮助。我认为问题是关于泛型的。如果定义了一个方法
tfoo(T值)
,则不能执行任何算术运算。自动装箱在这里没有帮助。但是您如何知道要使用哪个value.someValue()方法呢?对值本身执行instanceof检查吗?这就是同样的问题,移动到代码中不同的位置。决定返回哪种类型也有同样的困难。如果有人输入了一个大十进制怎么办?然后这些方法就完全失败了。但是你怎么知道应该使用哪个value.someValue()方法呢?对值本身执行instanceof检查吗?这就是同样的问题,移动到代码中不同的位置。决定返回哪种类型也有同样的困难。如果有人输入了一个大十进制怎么办?那么这些方法就完全失败了。