2012-05-07 8 views
6

私はJavaのジェネリックを学んでいる、私はこの試みたインスタンス化ジェネリックのパラメータ

class Person { 
    public static <T> T say() { 
     return new T; // this has error 
    } 
} 

(これはしかしC#で可能である)一般的なパラメータから受信したタイプのインスタンスを作成するいくつかの問題に暗礁:generics in Java - instantiating T

public static <T> T say(Class<?> t) { 
    return t.newInstance(); 
} 

エラー:

incompatible types 
found : capture#426 of ? 
     required: T 

動作しません。以下は大丈夫に見えますが、それはいくつかのクラスをインスタンス化伴い、静的な方法で使用することはできません。Instantiating generics type in java

public class Abc<T> 
{ 

    public T getInstanceOfT(Class<T> aClass) 
    { 
     return aClass.newInstance(); 
    }  

} 

これはのJava人々が言っ​​ている型消去ですか?これはタイプ消去の制限ですか?

この問題の回避策を教えてください。

答えて

8

あなたは非常に近くでした。あなたは(「タイプTのクラス」を意味する)Class<T>と(「任意の型のクラス」を意味する)Class<?>を交換する必要があります。

public static <T> T say(Class<T> t) throws IllegalAccessException, InstantiationException { 
    return t.newInstance(); 
} 
+0

+1と受け入れ、ないC#、あなたではない(ただしほどエレガント障害;-))。 Btw、これは型消去と呼ばれているので、Tを直接インスタンス化できないのはなぜですか? – Hao

+1

@Hao:正確には、実際のタイプのTは実行時に使用できません。そのため、明示的にするにはClassオブジェクトを渡す必要があります。 –

関連する問題