はのは、次のコードを考えてみましょう:JavaのgetGenericSuperclass()。どのように機能するのですか?
package index;
public class Main {
public static void main(String[] args) {
Inner inner = new Inner();
Type t = inner.getClass().getGenericSuperclass();
ParameterizedType p = (ParameterizedType) t;
Type[] a = p.getActualTypeArguments();
try {
Custom c = (Custom) ((Class) a[0]).newInstance();
c.f();
} catch (Exception e){}
}
private static abstract class AbstractClass<T> {
public abstract void doSth();
}
private static class Inner extends AbstractClass<Custom>{
public void doSth() {
}
}
private static class Custom{
public Custom(){
}
public void f(){
System.out.println("Custom");
}
}
}
それが動作し、私はそれが動作ん方法を理解することはできません。これは、スーパークラスのパラメータに関する情報を取得することが可能であることを示しています。私は、バイトコードを見てそのような情報がないので、そのような情報を得ることがどのように可能であるかわかりません:
それはいいですか?
1. ['Class.getGenericSuperclass()'](https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getGenericSuperclass--)のjavadocを読んでください。 2.はい。 –
あなたが示したのは、 'Inner'ではなく' Main'のバイトコードなので、Innerが汎用スーパークラスを格納しているかどうかは分かりません。正確に言うと、これはバイトコードでさえありません。これは特定のバイトコード処理プログラムの出力です。そのプログラム出力に特定の情報がない場合、この情報がクラスファイルに存在しないことは証明されません。 – Holger