2

私の問題を説明するサンプルを次に示します。

public class Scratch {
    public <T> Set<T> method(Class<T> clazz){return null;}

    public static void main(String[] args){
        Scratch s=new Scratch();
        Set<List<String>> list=s.method(List.class); //Gives error here.  How do I say List<String>.class?
    }
}

上記の clazz 変数について本当に言いたいのですList<String>.classが、それは適切な構文ではありません。ジェネリックを間違った方法で使用しているだけですか?

4

2 に答える 2

2

これは、言語と標準ライブラリの制限です。

回避策は、単にそれを残酷にキャストすることです

(Class<List<String>>)(Class)List.class
于 2013-01-10T17:24:07.987 に答える
0

使用するとClass<?> clazzうまくいきました。

変更されたコードは次のとおりです。

public class Scratch {
    public <T> Set<T> method(Class<?> clazz){return null;}

    public static void main(String[] args){
        Scratch s=new Scratch();
        Set<List<String>> list=s.method(List.class); 
        Set<Map<String,String>> map=s.method(Map.class);
    }
}

私を正しい方向に押してくれた@Trarothに感謝します。リストだけでなく、真に一般的な構造をサポートするように彼の答えを修正しました。

編集:あなたは何か悪いことをすることができるので、私はまだ上記の答えに完全に満足していません. 次の例を検討してください。

public class Scratch {
    public <T> Set<T> method(Class<?> clazz){return null;}

    public static void main(String[] args){
        Scratch s=new Scratch();
        Set<List<String>> list=s.method(Map.class); //Should've passed List.class, but the compiler doesn't care.
        Set<Map<String,String>> map=s.method(Map.class);
    }
}

すべてがコンパイルされ、実行時エラーが発生する可能性があります (実装によって異なります)。他にアドバイスあればよろしくお願いします...

于 2013-01-10T17:04:20.910 に答える