gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:40:20 24 4
gpt4 key购买 nike

你好,我想做一件非常简单的事情。只需为任何数字制作一个模板函数即可。我实际上想要的只是“添加”的能力。在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com