13

あらゆるタイプの数値(float、intなど)の配列で使用できるはずのクラスを作成しているので、次の1つのメソッドを使用します。

// T extends Number
public synchronized T[] average() {
    Number[] ret = new Number[queue[0].length];
    for (int i = 0; i < ret.length; ++i) {
        for (int j = 0; j < size; ++j) {
            ret[i] += queue[j][i]; // WTF ERROR?!
        }
        ret[i] /= size; // WTF ERROR?!
    }
    return (T[])ret;
}

ただし、「Number」は「+=」または「/=」演算子を実装していないため、これはコンパイルされません。さらに悪いことに、JavaのNumberクラスは、「+」や「-」などの最も基本的な演算子さえも実装していません。数値を追加できないと考えているためにJavaでコンパイルできない場合、数値の配列の平均を返すメソッドを作成するにはどうすればよいですか?!?!

4

7 に答える 7

14

あなたはJavaで数字がどのように機能するかを誤解しています。このNumberクラスは、プリミティブ型(、など)をオブジェクトとして表すのに役立つ数値ラッパークラス(、など)Integerのスーパークラスですが、通常の算術演算子では機能しません。Floatintfloat

算術演算子を使用する場合は、プリミティブ型を使用してください。すべての数値データ型で機能する「ジェネリック」メソッドを構築する必要がある場合は、同じメソッドのオーバーロードされたバージョンをいくつか構築する以外に選択肢はありません。たとえば、データ型ごとに1つずつです。

public  float[] average(float[][]  queue) {...}
public double[] average(double[][] queue) {...}

また、このようなコードはラッパータイプで機能するように見えることに注意してください

Integer i = 0;
i += 1;
System.out.println(i);

...しかし、内部的には、演算子はプリミティブ型に対してのみ機能するため、Javaは自動的にボックス化とボックス化解除を行います。数値がであることが明示的に示されているため機能しますが、Javaはボクシング/アンボクシングを実行するために処理している数値のタイプを正確に知る必要があるため、では機能しません。Integer+=IntegerNumber

于 2012-01-22T00:41:39.057 に答える
2

数値をプリミティブ型に変換する必要があります。そうすれば、算術演算子が機能します。、、などNumberがありdoubleValueます。intValue

または、に変換して、そのクラスで定義されてBigDecimalいる算術メソッドを使用することもできます(、、などではなく、、など)。floatとdoubleは離散的な数値のセットのみを表すため、この方法はより正確になります(最高の精度が必要な場合は、を使用してください)。BigDecimalsは不変であるため、操作の結果を常に参照に割り当てる必要があることに注意してください。+-addmultiplyBigDecimal

于 2012-01-22T00:34:37.877 に答える
1

これがあなたの望むものだと思います

public synchronized average() {  
    double ret = new double[queue[0].length];  
    for (int i = 0; i < ret.length; ++i) {  
        for (int j = 0; j < size; ++j) {  
            ret[i] += queue[j][i];  
        }  
        ret[i] /= size;  
    }  
    return ret;  
}
于 2012-01-22T01:18:26.320 に答える
0

Javaでは、算術演算子はプリミティブ型でのみ機能します。ここでの問題は、Javaにはこれらのプリミティブ型のクラス表現があり、オートボクシングと呼ばれる機能を介して、一般に、ある型から別の型への切り替えが暗黙的に行われることです。

この場合、必要な算術演算のタイプのメソッドを実装する必要があります。場合によっては、すべての演算に渡されるすべての可能な数値型に対してオーバーロードされたメソッドを作成する必要があります。

于 2012-01-22T00:47:29.963 に答える
0

悲しいことに、あなたはできません。算術演算子は、プリミティブ型でのみ機能します(ラッパーの自動ボックス化と自動アンボックス化のおかげで)。多くのJDKクラスで行われているように、メソッドが機能する必要があるすべてのプリミティブ型に対して、指定されたメソッドをオーバーライドする必要があります。

于 2012-01-22T00:37:57.457 に答える
0

可能なすべての、、、、、byteshort、はるかに効率的で(オブジェクトではなくプリミティブとして)、代わりに使用するのが簡単でcharあるintため、正確に、またはBigDecimalまたはBigInteger が必要な場合は、特定のタイプが必要になります。floatdoubledoubledoubleNumberlong

于 2012-01-22T08:55:42.947 に答える
-1
public int showAllNum(Number i, Number j) {
    return (int) (i.doubleValue()+j.doubleValue()); 
}
于 2018-06-15T16:17:24.753 に答える