質問

私は、次のコードを持っています:

class SuperClass {
    public static String getName() { return "super"; }
}

class SubClass extends SuperClass {
    public static String getName() { return "sub"; }
}

public class Dummy<T extends SuperClass> {
    public void print() {
        System.out.println("SuperClass: " + SuperClass.getName());
        System.out.println("SubClass: " + SubClass.getName());
        System.out.println("T: " + T.getName());
    }
    public static void main(String[] args) {
        new Dummy<SubClass>().print();
    }
}

このコードは、次の出力:

SuperClass: super
SubClass: sub
T: super

私の質問は次のとおりです。 なぜT.getName())(SubClass.getNameの値を返しませんか?すべての後、私はそのT ==サブクラスを指定しました。それとも静的関数は、一般的な参照のための無効な呼び出します?

事前のおかげでたくさん!

役に立ちましたか?

解決

このは、ジェネリック医薬品についてだけの問題ではありません。

あなたが言う場合:

SuperClass obj = new SubClass();
System.out.println(obj.getName());

あなたはまた、「スーパー」を取得します。何の「多型」の静的メソッドがありません。

あなたのケースでは、すべてのコンパイラはTについて知っていることは、それはSuperClassを呼び出しますので、それは、SuperClass.getName()を拡張することです。

他のヒント

それだけでTのすべての値の1つのクラスを生成し、この場合のTには、Tのスーパータイプに、このクラスでSuperClassを入力するすべての参照を変換しますので、

C ++のテンプレートとは異なり、Javaのジェネリックは、用途、その後、型消去で働きます静的メソッドの呼び出しにメソッドをオブジェクトの呼び出しのための分散、および静的ディスパッチを提供するために、仮想派遣。

ですから、Dummy<SubClass>.print()を行う際に、コンパイラでは、グローバル・TSubClassDummyで置き換えることはありません。すべてのコンパイラはTの方法で引数や戻り値の型としてDummyの使用チェックがSubClassあるされません。そこDummy内部の任意のコードへの変更はませんので、同じSuperClass静的メソッドがあるものは何でもT呼び出されます。

あなたはパラメータ化のタイプに応じて、一般的なクラスで異なる動作をする場合は、

、あなたがその型のオブジェクトを渡すと、仮想メソッドを使用するか、またはタイプや使用リフレクションのためのクラスに渡しています。

あなたは「新しいダミー()」を持つクラスをインスタンス化すると

あなたは、実際には何も設定しないデフォルトコンストラクタと呼ばれます。 printメソッドが呼ばれました場合は、VMはTのタイプは、クラス宣言で宣言され、スーパークラスであることを見ました。これは、このクラスの静的メソッドを呼び出します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top