Java:使用泛型实现对不同类型的数字进行操作的类

Java:使用泛型实现对不同类型的数字进行操作的类,java,generics,Java,Generics,所以,假设我想写一个对不同类型的数字进行运算的类,但我事先不知道我将对什么类型的数字(例如整数、双精度等)进行运算 我想使用泛型为这个场景创建一个通用类。比如: Adder<Double> adder = new Adder<Double>(); adder.add(10.0d, 10.0d); // = 20.0d interface Adder<T> { T add(T arg1, arg3); } 加法器加法器=新加法器(); 加法器。

所以,假设我想写一个对不同类型的数字进行运算的类,但我事先不知道我将对什么类型的数字(例如整数、双精度等)进行运算

我想使用泛型为这个场景创建一个通用类。比如:

 Adder<Double> adder = new Adder<Double>();
 adder.add(10.0d, 10.0d);   // = 20.0d
interface Adder<T> {
   T add(T arg1, arg3);
}
加法器加法器=新加法器();
加法器。加法(10.0d,10.0d);/=20.0d
但是,我无法实例化传入加法器类的泛型类型!那么,该怎么办?

uh哦---泛型不是C++模板。由于类型擦除,您的示例中的
Double
甚至不会显示到运行时系统

在您的特定情况下,如果您只想将各种类型添加到一起,我可以建议方法重载吗?e、 例如,
double add(double,double)
float add(float,fload)
BigDecimal add(BigDecimal,BigDecimal)
,等等。

我想你可以做你想做的事,但鉴于你提供的信息,我不确定。听起来好像你想要以下的一些变化:

public class Foob<T extends Number> {

    public T doSomething(T t1, T t2) {
        return null;
    }
}
公共类Foob{
公共剂量测定法(t1,t2){
返回null;
}
}

如果您不知道要对哪些类型的数字进行操作,那么您可能不会使用自己的实例变量。在这种情况下,您可以编写静态方法,而无需实例化类


如果您确实需要自己的中间变量,那么您可能需要为正在使用的每类用户变量定义不同的中间变量。例如,如果有人试图使用您的类对BigDecimal变量进行操作,您可能不会使用int变量作为中间结果。

我不确定泛型是否是您想要的。java中的泛型用于强制执行编译时约束,而不是运行时多态性。我认为你真正想要的是使用重载。使用泛型,您将得到如下结果:

 Adder<Double> adder = new Adder<Double>();
 adder.add(10.0d, 10.0d);   // = 20.0d
interface Adder<T> {
   T add(T arg1, arg3);
}
接口加法器{
T添加(T arg1,arg3);
}
还有一堆:

class DoubleAdder implements Adder<Double> {
   Double add(Double arg1, Double arg2) {
      return arg1.add(arg2);
   }
}
if (arg1 instanceof Double) {
   Adder<Double> adder = new DoubleAdder();
}
类双加法器实现加法器{
双加(双arg1,双arg2){
返回arg1.add(arg2);
}
}
然后是一堆:

class DoubleAdder implements Adder<Double> {
   Double add(Double arg1, Double arg2) {
      return arg1.add(arg2);
   }
}
if (arg1 instanceof Double) {
   Adder<Double> adder = new DoubleAdder();
}
if(arg1 instanceof Double){
加法器加法器=新的双加法器();
}

使用泛型并不能为你节省任何东西。

我同意拉普利的观点。超载是对你有帮助的。使用泛型最接近的方法如下:

公共类数字图标
{
公共T添加(T n1,T n2){
//n1.添加(n2);
//这是不可能的,因为Number没有add方法,因此
//您必须确定n1的类型。
//我们无法确定U的类型,因为它在运行时不存在
//由于类型擦除
如果(n1整数的实例){
//添加整数…
}
如果(双精度的n1实例){
//添加双打
}
返回null;
}
}


但是这并没有多大帮助,因为使用泛型没有任何好处。

如果你能接受将所有东西都转换为双精度的计算,那么你可以使用多态性

Number someNumberFunction(Number n1, Number n2) 
{
  double
      d1 = n1.doubleValue(),
      d2 = n2.doubleValue();

  /* perform computations on d1 & d2 */
}

不幸的是,这在BigInteger或BigDecimal上不能很好地工作

我假设加法器将被声明为类加法器,在这种情况下,“add”方法实现将只能使用数字API。您打算如何使它对所有数字对象正确工作?添加biginger的实现对于添加double不起作用;什么是i+i?机器代码的艺术风格令人讨厌。接受它。或者确保下一种语言更聪明。0投票否决谢谢,克里斯。但是,说真的,我有一个大类,它需要对不同类型的数字执行相同(大量)的操作。你是说我要把它放回复印粘贴机上?