次のようにポイントを定義してみてください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 は null である可能性があるため、確認する必要があることに注意してください。X
ここでand を指定すると、 aのメンバー メソッドに aY
を渡すことができます。ここでandを再定義することもできますが、それは混乱の元になる可能性があります。Point<Float, Integer>
Point<Double, Long>
E
F
編集:
Mark Peters のコメントについて少し詳しく説明します。
floatValue()
or evenを使用doubleValue()
すると、精度が失われる可能性があります。even では各値double
を正確に表すことができないからです。long
したがって、特に数値が大きい場合は、深刻な精度の低下が発生する可能性があります。
さらに、BigInteger
とBigDecimal
も数値であり、それらはさらに高い精度を持っています。
最大の精度を得るにBigDecimal
は、計算で使用する必要があり、初期値を作成するときに、値のタイプを確認して適切なメソッドを呼び出す必要があります。
- for
Byte
、Short
、Integer
およびLong
あなたが呼び出すだろうBigDecimal.valueof( x.longValue() )
- for
Float
とDouble
あなたが呼ぶだろうBigDecimal.valueof( x.doubleValue() )
BigDecimal
そのまま使用できました
BigInteger
BigDecimal
コンストラクタに渡されます
これにより、かなりの複雑さが追加されます。その場合、Point
代わりにサブクラス化に関するarshajiiの提案を使用することをお勧めします。