一般的なサブクラスへの静的参照を行うことができない(ジャワ)
-
21-08-2019 - |
質問
私は、次のコードを持っています:
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()
を行う際に、コンパイラでは、グローバル・T
でSubClass
でDummy
で置き換えることはありません。すべてのコンパイラはT
の方法で引数や戻り値の型としてDummy
の使用チェックがSubClass
あるされません。そこDummy
内部の任意のコードへの変更はませんので、同じSuperClass
静的メソッドがあるものは何でもT
呼び出されます。
、あなたがその型のオブジェクトを渡すと、仮想メソッドを使用するか、またはタイプや使用リフレクションのためのクラスに渡しています。
あなたは、実際には何も設定しないデフォルトコンストラクタと呼ばれます。 printメソッドが呼ばれました場合は、VMはTのタイプは、クラス宣言で宣言され、スーパークラスであることを見ました。これは、このクラスの静的メソッドを呼び出します。