1

このコードが 1.0 ではなく 2.0 を出力するのはなぜですか?

abstract class B<T extends Number> {
    abstract Number f(T j);
}

class A<T extends Number> extends B<T> {
    public Number f(Float j) {
        return 1f;
    }

    public Number f(T j) {
        return j;
    }
}

public class J {
    public static void main(String[] args) {
        B<Float> a = new A<>();
        Number r = a.f(2f);
        System.out.println(r);
    }
}
4

4 に答える 4

6

何を期待していますか。クラス B で宣言されているメソッドは 1 つだけです。

abstract Number f(T j);

クラスAのメソッド

public Number f(Float j);

前者をオーバーライドしません。それらには異なる署名があります。だから方法は

public Number f(T j) {
    return j;
}

呼ばれます。

于 2012-11-10T18:29:06.323 に答える
2

したがって、ここでの問題の核心は、変数aが型であると宣言したことですBBクラスにはメソッドが1つしかないため、それが勝ちです。ただし、のタイプをmainタイプに変更すると、あいまいなためコンパイルされないことに気付くでしょう。ただし、代わりにプリミティブを受け入れるようにクラスのメソッドを変更し、メソッドで変数を型として定義した場合、結果はになります。つまり、次のように印刷されます。aAAmain()aA1.01.0

class A<T extends Number> extends B<T> {
    public Number f(float j) {
        return 1f;
    }

    public Number f(T j) {
        return j;
    }
}


public class J {
    public static void main(String[] args) {
        A<Float> a = new A<>();
        Number r = a.f(2f);
        System.out.println(r);
    }
}
于 2012-11-10T19:06:39.300 に答える
1

以下のコードで

abstract class B<T extends Number> {
 abstract Number f(T j);
}

class A<T extends Number> extends B<T> {
    public Number f(Float j) //this method does not override the superclass method

    {
        return 1f;
    }

    public Number f(T j) {
        return j;
    }
}

public class J {
    public static void main(String[] args) {
        B<Float> a = new A<>();
        Number r = a.f(2f);
        System.out.println(r);
    }
}

af(2f) への呼び出しが発生すると、

public Number f(T j)
{
return j;
}

jを返すため、提供される出力は2.0です

于 2012-11-10T18:36:48.837 に答える
0

floatと同じではありませんFloat

自動ボクシングは同じように感じnullますが、主な違いの 1 つは、floatパラメーターに a を渡すことができないことです。

オーバーライドされたメソッドで注釈を使用することをお勧めし@Overrideます。これにより、署名が正しいかどうかがコンパイラによって通知されます

于 2012-11-10T19:14:02.730 に答える