gpt4 book ai didi

java - 如何从通用数据中减去值(value)

转载 作者:行者123 更新时间:2023-12-01 18:44:29 24 4
gpt4 key购买 nike

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

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

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

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

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

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

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

如何推断这里的类型?

this.y-pt.y.TypeValue?

如果是整数或者 double 怎么办?

当我经过

pt.getdistance(otherpt); 

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

最佳答案

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

但是,您甚至可能想将其简化为 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 可能为空,因此您必须检查这一点。指定XY这里将允许您传递 Point<Float, Integer>Point<Double, Long>的成员方法。您可以重新定义EF在这里,但这可能会引起困惑。

编辑:

我将详细说明 Mark Peters 的评论:

使用floatValue()甚至doubleValue()可能会导致精度损失,因为即使 double将无法准确表示每个 long值(value)。因此,您可能会遇到严重的精度损失,尤其是数字较大时。

此外,BigIntegerBigDecimal也是数字,而且精度更高。

为了获得最大精度,您必须使用 BigDecimal在计算和创建初始值时,您必须检查值的类型并调用适当的方法:

  • 对于 Byte , Short , IntegerLong你可以打电话 BigDecimal.valueof( x.longValue() )
  • 对于 FloatDouble你可以打电话 BigDecimal.valueof( x.doubleValue() )
  • BigDecimal可以按原样使用
  • BigInteger将被传递到BigDecimal构造函数

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

关于java - 如何从通用数据中减去值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18407947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com