0

ジェネリックを使用してさまざまなタイプのインターフェイスに適応するメソッドを作成しようとしています。

このコードでは、メソッド f an g が「interface A」ではなく「BB」を出力すると予想していました。なぜこれが起こったのですか?

interface A {
    String n="interface A";
}

interface B extends A {
    String n = "BB";
}

public class Main {
    <T extends A> void f() {
        T a = null;
        System.out.println(a.n);
    }

    <T extends A> void g() {
        System.out.println(T.n);    
    }

    public static void main(String[] args) {
        Main m = new Main();
        m.<B>f();
        m.<B>g();
    }
4

2 に答える 2

4

コードでは、拡張/実装するすべてのクラスまたはインターフェイスがA定数 variable を継承しますn

実際の宣言は次のinterface Aようになります。

interface A {
    public static final String n = "interface A"; //constant static varible
}

finalまた、Java で変数をオーバーライドすることはできません。

あなたが書くなら

System.out.println(B.n);

「BB」と出力されます。

ここで同様の質問への回答を見つけることができます

于 2012-06-17T08:47:45.887 に答える
0

コード スニペットに問題が多すぎます。

  1. インターフェイスにフィールドを定義しようとしました。これは禁止されています。インターフェイスでは、メソッドまたは静的フィールドのみが許可されます。
  2. メソッドfは終了していません。
  3. 何をしようとしているのかは明確ではありません。

最初にメタモルフィズムについて読むことをお勧めします。次に、ジェネリックなしでいくつかの演習を実装してみてください。次に、ジェネリックについて読み、何をしようとしているのかを考え、ジェネリックを使用して 2 番目の演習を実装します。それでも質問がある場合は、ここに投稿してください。喜んでお手伝いさせていただきます。

幸運を。

于 2012-06-17T08:51:08.183 に答える