有两个问题:首先,如果要快,就必须直接使用原语,而这些在泛型中是不支持作为参数的。这实际上意味着您必须分别维护三个版本Point
。
如果要使用泛型,可以使用对应的类(如Integer
),但还有一个问题:它们的超类型Number
没有add
方法(更不用说+
运算符或+=
)。
所以我知道的唯一方法是实现你自己的支持add
方法的数字类层次结构:
abstract class Numeric<T extends Number> {
public abstract T getValue();
public abstract Numeric<T> add(Numeric<T> other);
@Override
public String toString() {
return getValue().toString();
}
}
class MyInt extends Numeric<Integer> {
public final Integer value;
public MyInt(Integer _value) {
super();
this.value = _value;
}
@Override
public Integer getValue() {
return this.value;
}
@Override
public Numeric<Integer> add(Numeric<Integer> other) {
return new MyInt(this.value + other.getValue());
}
}
class MyDouble extends Numeric<Double> {
public final double value;
public MyDouble(Double _value) {
super();
this.value = _value;
}
@Override
public Double getValue() {
return this.value;
}
@Override
public Numeric<Double> add(Numeric<Double> other) {
return new MyDouble(this.value + other.getValue());
}
}
基于此,您至少可以实现一个通用点:
class NumericPoint<T extends Number> {
public final Numeric<T> x;
public final Numeric<T> y;
public NumericPoint(Numeric<T> _x, Numeric<T> _y) {
super();
this.x = _x;
this.y = _y;
}
public NumericPoint<T> add(NumericPoint<T> other) {
return new NumericPoint<T>(this.x.add(other.x), this.y.add(other.y));
}
@Override
public String toString() {
return "(" + this.x + "/" + this.y + ")";
}
}
与
NumericPoint<Integer> ip1 =
new NumericPoint<Integer>(new MyInt(1), new MyInt(2));
NumericPoint<Integer> ip2 =
new NumericPoint<Integer>(new MyInt(3), new MyInt(4));
NumericPoint<Integer> ip = ip1.add(ip2);
System.out.println(ip);
NumericPoint<Double> dp1 =
new NumericPoint<Double>(new MyDouble(1.1), new MyDouble(2.1));
NumericPoint<Double> dp2 =
new NumericPoint<Double>(new MyDouble(3.1), new MyDouble(4.1));
NumericPoint<Double> dp = dp1.add(dp2);
System.out.println(dp);
我修改了您的示例:数字和点是不可变的。例如,它的实现方式BigDecimal
。所以该add
方法属于泛型类,它返回一个新实例。