试着像这样定义你的观点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 可能为空,因此您必须进行检查。在此处指定X
andY
将允许您将 a 传递Point<Float, Integer>
给 aPoint<Double, Long>
的成员方法。您可以在此处重新定义E
and F
,但这可能会造成混淆。
编辑:
我将详细说明 Mark Peters 的评论:
使用floatValue()
or evendoubleValue()
可能会导致精度损失,因为 evendouble
无法准确表示每个long
值。因此,您可能会遇到严重的精度损失,尤其是在数字较大的情况下。
此外,BigInteger
andBigDecimal
也是数字,并且具有更高的精度。
为了获得最大精度,您必须BigDecimal
在计算中使用,并且在创建初始值时,您必须检查值的类型并调用适当的方法:
- 对于
Byte
, Short
,你会打电话Integer
给Long
BigDecimal.valueof( x.longValue() )
- 你会
Float
打电话给Double
BigDecimal.valueof( x.doubleValue() )
BigDecimal
可以按原样使用
BigInteger
将传递给BigDecimal
构造函数
这会增加相当多的复杂性,在这种情况下,您可能希望采用 arshajii 的子类化建议Point
。