0

このような Point クラスを定義しました。

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

float、Integer ... [とにかく数値]を与えることができるように

しかし、それを操作したいときはエラーになります。

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

また、文字列を型として与えるべきではないので、数値に変更する必要がありますか? またはジェネリック型からの距離を計算する他の方法はありますか?

しかし、タイプを Number に変更した場合、別の座標タイプ [float または integer] を指定するにはどうすればよいですか?

ここでタイプを推測する方法は?

this.y-pt.y.TypeValue?

整数または倍精度の場合はどうすればよいですか?

私が通過するとき

pt.getdistance(otherpt); 

コンパイラがエラーを示しています: メソッド getdistance(Float,Integer) を作成してください。そのメソッドに他のポイントを渡す方法は?

4

2 に答える 2

3

次のようにポイントを定義してみてください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 は null である可能性があるため、確認する必要があることに注意してください。Xここでand を指定すると、 aのメンバー メソッドに aYを渡すことができます。ここでandを再定義することもできますが、それは混乱の元になる可能性があります。Point<Float, Integer>Point<Double, Long>EF

編集

Mark Peters のコメントについて少し詳しく説明します。

floatValue()or evenを使用doubleValue()すると、精度が失われる可能性があります。even では各値doubleを正確に表すことができないからです。longしたがって、特に数値が大きい場合は、深刻な精度の低下が発生する可能性があります。

さらに、BigIntegerBigDecimalも数値であり、それらはさらに高い精度を持っています。

最大の精度を得るにBigDecimalは、計算で使用する必要があり、初期値を作成するときに、値のタイプを確認して適切なメソッドを呼び出す必要があります。

  • for ByteShortIntegerおよびLongあなたが呼び出すだろうBigDecimal.valueof( x.longValue() )
  • forFloatDoubleあなたが呼ぶだろうBigDecimal.valueof( x.doubleValue() )
  • BigDecimalそのまま使用できました
  • BigIntegerBigDecimalコンストラクタに渡されます

これにより、かなりの複雑さが追加されます。その場合、Point代わりにサブクラス化に関するarshajiiの提案を使用することをお勧めします。

于 2013-08-23T16:52:39.863 に答える
1

Number を次のように拡張する必要があることを型に伝えることができます。

<T extends Number, T1 extends Number>

このようにして、Floatなどを渡すことができます

于 2013-08-23T16:51:35.363 に答える