1

私はこのリンクを通り抜けていました

Java ジェネリック クラス - 型の判別

このプログラムで試しました。

package my;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class GenericTypeIdentification {

    public static void main( String args[] ) {
        Node<Integer> obj = new GenericTypeIdentification().new SubNode<Integer>( 1 );
        ParameterizedType parameterizedType = ( ParameterizedType ) obj.getClass().getGenericSuperclass();
        Type clazz = parameterizedType.getActualTypeArguments()[0];
        if ( clazz == Integer.class ) {
            System.out.println( 1 );
        }
        else {
            System.out.println( 2 );
        }
    }

    class Node<T> {

        private final T value;

        public Node( T val ) {
            this.value = val;
        }

        public T evaluate() {
            return value;
        };

    }

    class SubNode<T> extends Node<T> {

        private final T value;

        public SubNode( T val ) {
            super( val );
            value = val;
        }

        @Override
        public T evaluate() {
            return value;
        };
    }
}

私の理解では、出力を次のよう1に印刷する必要がありますが、印刷し2ます。これを理解するのを手伝ってください。ありがとう。

4

2 に答える 2

3

実際に機能するトリックは、 Google GuiceのTypeLiteralで使用されています。ジェネリック クラスのサブクラスのコンストラクターでは、実行時であっても、親のジェネリック "インスタンス化" にアクセスできます。コンパイル時にジェネリック型情報が継承目的で保持されているためです使用例:

TypeLiteral<MyClass> test = new TypeLiteral<MyClass>() {}; // notice the {} to build an anon. subclass
System.err.println(test.getType()); // outputs "MyClass"

これは、型消去のためにジェネリックのサブクラスを使用しないと機能しません。おそらくほとんどのアプリケーションにとってやり過ぎです。

于 2013-09-04T09:53:51.537 に答える
1

この場合、Clazz は T になります。

ジェネリックは、Java ではコンパイル時にのみ考慮されます。メンバーのクラスを調べることで、実行時にコレクションの型パラメーターの値を決定しようとすることができます (100% の確実性がなければ、サブクラスになってしまう可能性があります...)。実行時に空のコレクションの型パラメーター値を決定する方法はありません。

于 2013-09-04T09:44:24.290 に答える