java - 如何制作使用数字加法的模板类(其中模板扩展了 Number)?

标签 java templates generics numbers

你好,我想做一件非常简单的事情。只需为任何数字制作一个模板函数即可。我实际上想要的只是“添加”的能力。在 C++ 中,这真的很简单:

template <typename T>
inline T add (T a, T  b) { 
    return a + b; 
}  

int main(int argc, char** argv){
   printf("int: %d\n",add(1,2));
   printf("float: %f\n",add(1.1,2.1));
}

在 Java 中我得到了惨痛的教训。我是 Java 新手,所以我相信(并希望)我完全错了,并且对此进行了过度设计。但我唯一想到的是:

public interface IntrfcWowNumbersAdds<T> {
    T add(Number v);
}

public class SuperSmartInteger extends Number implements IntrfcWowNumbersAdds<SuperSmartInteger>{
    private Integer i;
    public SuperSmartInteger(int v) {
        i = v;
    }

    @Override
    public String toString(){
        return ""+i;
    }

    @Override
    public SuperSmartInteger add(Number v) {
        return new SuperSmartInteger(this.intValue()+v.intValue());
    }

    @Override
    public int intValue() {
        return i; // thx god for auto(un)boxing
    }

    @Override
    public long longValue() {
        return i;
    }

    @Override
    public float floatValue() {
        return i;
    }

    @Override
    public double doubleValue() {
        return i;
    }
}

请注意,上面这个疯狂的包装器我必须为任何我想使用模板的数字(例如 double ,字节等...)做

public class ThreadSafeNum<T extends Number & IntrfcWowNumbersAdds<T>> {
    private T    num;

    public ThreadSafeNum(T n){
        num = n;
    }

    public T add(T v){
        // note in here I plan to do some locking...
        return num = num.add(v);
    }
}

然后我可以将其用作:

SuperSmartInteger i = new SuperSmartInteger(5);
SuperSmartInteger i2 = i.add(6);
System.out.println(""+i2);
ThreadSafeNum<SuperSmartInteger> tsn = new ThreadSafeNum<SuperSmartInteger>(i);
SuperSmartInteger i3 = tsn.add(i2);

我知道当 add() 只是添加时,我可以只使用 + 运算符并依赖自动(取消)装箱。但我的 add() 方法是为了做一些额外的事情(比如锁定)。

那么如何正确地做到这一点呢?还是我的方法正确???

最佳答案

像这样的基类:

public abstract class Addable<T extends Number,U extends Addable<T,U>> {
  private final T value;
  public Addable( final T value ){ this.value = value; }
  public T getValue(){ return value; }
  public abstract U add( U addend );
}

这作为子类:

public class AddableInteger extends Addable<Integer,AddableInteger> {
  public AddableInteger( final Integer value ){
    super( value );
  }

  @Override
  public AddableInteger add( final AddableInteger addend ){
    java.util.Objects.requireNonNull( addend );
    return new AddableInteger( this.getValue() + addend.getValue() );
  }
}

关于java - 如何制作使用数字加法的模板类(其中模板扩展了 Number)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30260013/

相关文章:

java - 为什么我测试golang goroutine比java Thread慢

java - Java 中的运算符重载(整数包装类)?

java - 字符串无法正确打印的错误

C++ 将 void 指针转换为模板类

hibernate - 在通用 Java 编程中使用 Quarkus Panache 实体时出错

java - int 与整数比较 Java

c++ - 将基本模板类的派生类作为其基本模板类传递给函数

c++ - 模板数据成员

c# - FakeItEasy:在不指定类型的情况下伪造对泛型方法的调用

.net - 如果 T 是类型 arg,如何使用 Nullable<T>?