Java 如何从通用数据中减去值

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您可以告诉类型他们应该扩展数字

我定义了这样一个Point类

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