2016-09-03 9 views
0

Javaリフレクションメカニズムで使用されるさまざまなインターフェイスとクラスを読み理解しようとしていますが、実際にTypeVariableインターフェイスを実装しているクラスのインスタンスを表すものは何ですか?Reflect TypeVariableインターフェイスを表現するもの

official documentationから次の引用は本当にあいまいです:タイプ変数tはタイプによって参照されている場合は

(すなわち、クラス、インタフェースまたは注釈型)T、およびTは、n番目で宣言されていますTの包含クラス(JLS 8.1.2を参照)であれば、tの生成は、i = 0からnまでのTのi番目の包含クラスの分解能(JVMS 5参照)を必要とする。型変数を作成して境界を作成してはなりません。

誰も私に、上の段落の意味を明確に説明する小さな例を教えてもらえますか?

ありがとうございます。

答えて

0

これは例えば、このタイプの使用とは異なること

public static <T> void f(){} 

class A<T> {} 

interface I<T> {} 

class B { 
    <T>B() { 
    } 
} 

注、次のコードで、すなわちT、メソッド、コンストラクタ、または型宣言の型変数を表しますIntegerは、次のコードスニペットで型変数ではありません。

List<Integer> list = Arrays.<Integer>asList(null); 

型変数の使用このによって表されていません。

public static <T> void h(T t) {} 
         ^
        Not a TypeVariable 

ここでは、標準APIのクラスの用途のリストです: ParametrizedTypeからhttps://docs.oracle.com/javase/8/docs/api/java/lang/reflect/class-use/TypeVariable.html


差:

TypeVariableは型変数の宣言を指し、ParametrizedTypeはそのような型の使用です。

例:

public class ReflectTest { 

    public Collection<String> c; 

    public static void main(String[] args) throws NoSuchFieldException { 
     System.out.println(Collection.class.getTypeParameters()[0]); // E 
     System.out.println(Collection.class.getTypeParameters()[0] instanceof TypeVariable); // true 
     System.out.println(Collection.class.getTypeParameters()[0] instanceof ParameterizedType); // false 
     Field field = ReflectTest.class.getField("c"); 
     System.out.println(field.getGenericType()); // java.util.Collection<java.lang.String> 
     System.out.println(field.getGenericType() instanceof TypeVariable); // false 
     System.out.println(field.getGenericType() instanceof ParameterizedType); // true 
    } 

} 
+0

しかし、あなたの例では 'T'は 'ParameterizedType'であることを表す別のインターフェイスを持っていませんか? – NinjaBoy2014

+0

私が理解していることは、 'TypeVariable'は型パラメータの抽象定義を表し、' ParameterizedType'は型パラメータの宣言と使用を表しますか? – NinjaBoy2014

+0

@ NinjaBoy2014: 'TypeVariable'は型パラメータの宣言であり、' ParametrizedType'は 'TypeVariable'型の型の使用です。 – fabian

関連する問題