试着像这样定义你的观点Point<E extends Number, F extends Number>:这样编译器就可以知道这E两者F都是数字。
但是,您甚至可能希望将其简化为,Point<N extends Number>因为很可能两个坐标都应该是相同的类型(即Double,Integer等等) - 混合类型对我来说似乎很奇怪。
然后必须调整该方法:
<X extends Number, Y extends Number> float getdistance(Point<X, Y> pt) {
float dx = this.x.floatValue() - pt.x.floatValue();
float dy = this.y.floatValue() - pt.y.floatValue();
return (whatever your distance calculation needs to look like);
}
请注意,x 和 y 可能为空,因此您必须进行检查。在此处指定XandY将允许您将 a 传递Point<Float, Integer>给 aPoint<Double, Long>的成员方法。您可以在此处重新定义Eand F,但这可能会造成混淆。
编辑:
我将详细说明 Mark Peters 的评论:
使用floatValue()or evendoubleValue()可能会导致精度损失,因为 evendouble无法准确表示每个long值。因此,您可能会遇到严重的精度损失,尤其是在数字较大的情况下。
此外,BigIntegerandBigDecimal也是数字,并且具有更高的精度。
为了获得最大精度,您必须BigDecimal在计算中使用,并且在创建初始值时,您必须检查值的类型并调用适当的方法:
- 对于
Byte, Short,你会打电话Integer给LongBigDecimal.valueof( x.longValue() )
- 你会
Float打电话给DoubleBigDecimal.valueof( x.doubleValue() )
BigDecimal可以按原样使用
BigInteger将传递给BigDecimal构造函数
这会增加相当多的复杂性,在这种情况下,您可能希望采用 arshajii 的子类化建议Point。