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