1

このコードでコンパイルエラーが発生する理由を誰か教えてもらえますか?

public class Main {

    public static void main(String[] args) {
        System.out.println(sum(2, 6.9));
    }

    public static <T extends Number<T>> T sum(T a, T b) {
        T result = a + b;      // compile-error here
        return result;
    }
}
4

4 に答える 4

5

Numberはジェネリック クラスではないため、パラメータ化できません。

public abstract class Number implements java.io.Serializable {
...
}

さらに、演算子は 、 などのサブタイプではなく、 、 などの+プリミティブ型でのみ機能します(編集: ボックス化を解除することでこれらを操作しますが、適切なラッパー クラスで結果を自動的にボックス化することはできません)。intlongNumberIntegerLong

(その理由の 1 つは、Numberポリモーフィズムの貧弱な例であることに気付きました。実際には、オブジェクトからプリミティブへの変換のみを実行します。)

于 2012-11-05T00:24:18.123 に答える
2

代わりに、次のようにインターフェイスを作成できます

public interface ALU  <T extends Number> {

    public  T add(T a, T b);
}

そして、作成したインターフェイスを実装するメイン クラスを作成します。

public class Main implements ALU <Integer>.

メインクラス内に add メソッドを作成します。

public Integer add(Integer a, Integer  b){
        return a + b;
    }

そして、これはうまくいきます。

于 2012-11-05T00:46:50.453 に答える
1

エラーのThe operator + is undefined for the argument type(s) T, T原因はThe type Number is not generic; it cannot be parameterized with arguments <T>

Eclipse で強調表示されているエラーはこの情報を提供しますが、他の IDE が同じ情報を提供するかどうかはわかりません。

于 2012-11-05T00:22:02.430 に答える
1

以下を使用する必要があります。

a.doubleValue()+b.doubleValue()

Number はクラスであり、演算子 + をサポートしていないため

于 2012-11-05T00:27:44.363 に答える