0

我已经定义了一个像这样的 Point 类。

class Point<E,F> {E x; E y; ...}

这样我就可以给出浮点数,整数... [无论如何它是一个数字]

但是当我想操纵它时,它会出错。

void getdistance(Point<Number, Number> pt) {
    this.x-pt.x.floatValue();   //not a statement
    this.y-pt.y.floatValue();
}

我也不应该将字符串作为类型,所以我应该将其更改为数字吗?或任何其他方式来计算与泛型类型的距离?

但是,如果我将类型更改为数字,我如何指定不同的坐标类型 [浮点或整数]?

如何在这里推断类型?

this.y-pt.y.TypeValue?

如果它的整数或双精度,我们该怎么办?

当我经过

pt.getdistance(otherpt); 

编译器显示错误:创建方法 getdistance(Float,Integer)。如何将其他点传递给该方法?

4

2 回答 2

3

试着像这样定义你的观点Point<E extends Number, F extends Number>:这样编译器就可以知道这E两者F都是数字。

但是,您甚至可能希望将其简化为,Point<N extends Number>因为很可能两个坐标都应该是相同的类型(即DoubleInteger等等) - 混合类型对我来说似乎很奇怪。

然后必须调整该方法:

<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,你会打电话IntegerLongBigDecimal.valueof( x.longValue() )
  • 你会Float打电话给DoubleBigDecimal.valueof( x.doubleValue() )
  • BigDecimal可以按原样使用
  • BigInteger将传递给BigDecimal构造函数

这会增加相当多的复杂性,在这种情况下,您可能希望采用 arshajii 的子类化建议Point

于 2013-08-23T16:52:39.863 回答
1

您可以告诉他们应该扩展 Number 的类型:

<T extends Number, T1 extends Number>

这样你就可以通过它 Float 等

于 2013-08-23T16:51:35.363 回答