Java 如何从通用数据中减去值
我定义了这样一个Point类Java 如何从通用数据中减去值,java,generics,Java,Generics,我定义了这样一个Point类 class Point<E,F> {E x; E y; ...} 如果是整数还是双精度,我们怎么办 当我经过时 pt.getdistance(otherpt); 编译器显示错误:创建方法getdistance(浮点,整数)。如何将其他点传递给该方法?您可以告诉类型它们应该扩展数字: <T extends Number, T1 extends Number> 通过这种方式,您可以传递它Float etc您可以告诉类型他们应该扩展数字
class Point<E,F> {E x; E y; ...}
如果是整数还是双精度,我们怎么办
当我经过时
pt.getdistance(otherpt);
编译器显示错误:创建方法getdistance(浮点,整数)。如何将其他点传递给该方法?您可以告诉类型它们应该扩展数字:
<T extends Number, T1 extends Number>
通过这种方式,您可以传递它Float etc您可以告诉类型他们应该扩展数字:
<T extends Number, T1 extends Number>
这样,您就可以通过Float etc来定义您的点:
点
。
这样编译器就可以分辨出E
和F
都是数字
但是,您甚至可能希望将其简化为点
,因为两个坐标很可能属于同一类型(即双
,整数
等)-混合类型对我来说似乎很奇怪
然后必须调整方法:
<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);
}
float getdistance(点pt){
float dx=此.x.floatValue()-pt.x.floatValue();
float dy=this.y.floatValue()-pt.y.floatValue();
返回(无论您的距离计算需要什么样);
}
请注意,x和y可能为null,因此您必须对此进行检查。
在此处指定X
和Y
将允许您将点
传递给点
的成员方法。您可以在这里重新定义E
和F
,但这可能会造成混淆
编辑:
我将详细阐述马克·彼得斯的评论:
使用floatValue()
或甚至doubleValue()
可能会导致精度损失,因为即使double
也无法准确表示每个长
值。因此,您可能会经历严重的精度损失,尤其是使用更高的数字时
此外,biginger
和BigDecimal
也是数字,它们的精度甚至更高
为了获得最大精度,您必须在计算中使用BigDecimal
,并且在创建初始值时,您必须检查值的类型并调用适当的方法:
- 对于
、Byte
、Short
和Integer
您可以调用Long
BigDecimal.valueof(x.longValue())
- 对于
和Float
您可以调用Double
BigDecimal.valueof(x.doubleValue())
可以按原样使用BigDecimal
将被传递给BigInteger
构造函数BigDecimal
这将增加相当多的复杂性,在这种情况下,您可能希望使用arshajii的建议,将
点
子类化。尝试这样定义您的点:点
。
这样编译器就可以分辨出E
和F
都是数字
但是,您甚至可能希望将其简化为点
,因为两个坐标很可能属于同一类型(即双
,整数
等)-混合类型对我来说似乎很奇怪
然后必须调整方法:
<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);
}
float getdistance(点pt){
float dx=此.x.floatValue()-pt.x.floatValue();
float dy=this.y.floatValue()-pt.y.floatValue();
返回(无论您的距离计算需要什么样);
}
请注意,x和y可能为null,因此您必须对此进行检查。
在此处指定X
和Y
将允许您将点
传递给点
的成员方法。您可以在这里重新定义E
和F
,但这可能会造成混淆
编辑:
我将详细阐述马克·彼得斯的评论:
使用floatValue()
或甚至doubleValue()
可能会导致精度损失,因为即使double
也无法准确表示每个长
值。因此,您可能会经历严重的精度损失,尤其是使用更高的数字时
此外,biginger
和BigDecimal
也是数字,它们的精度甚至更高
为了获得最大精度,您必须在计算中使用BigDecimal
,并且在创建初始值时,您必须检查值的类型并调用适当的方法:
- 对于
、Byte
、Short
和Integer
您可以调用Long
BigDecimal.valueof(x.longValue())
- 对于
和Float
您可以调用Double
BigDecimal.valueof(x.doubleValue())
可以按原样使用BigDecimal
将被传递给BigInteger
构造函数BigDecimal
这将增加相当多的复杂性,在这种情况下,您可能希望使用arshajii的建议,将
点
子类化。两个坐标都用E
类型声明(我不确定F
的位置)。好吧,因为他的示例方法参数是点
,我猜E
和F
意味着x和y的类型。我希望它是不同的,maybe@Dineshkumar然后使用第一种形式。然而,这对我来说仍然很奇怪;)你得小心点。由于没有完全精确地覆盖所有其他数据类型的数据类型,因此在一般情况下使用该类型可能会丢失信息。例如,混合浮点
和整数
<代码>整数的整数值精度比浮点
允许的精度高得多。调用floatValue()
将失去该精度。两个坐标都是用E
类型声明的(我不确定F
的位置)。因为他的示例方法参数是Point
,我想E