4

任意のジェネリック型のコレクションがあるとします ( Collection インターフェイスには注目しないでください)。Set、TreeSet、ArrayList、SortedSetなど...

次に、この擬似的な方法に似た方法が必要です(これには欠陥があります):

private static <T,V> T<V> returnPlease(T<V> obj) {
    return obj;
}

しかし、「タイプ T にはタイプ パラメータがありません」というメッセージが表示されるようになりました。

つまり、サブジェネリック型にもアクセスしたいのです。

私はより一般的な方法を知っています:

private static <T> T returnPlease(T obj) {
    return obj;
}

メソッドが TreeSet のどのタイプにもアクセスできるようにしたいだけです。TreeSet だけでなく、それが使用しているジェネリック バージョン (この場合は String) も含まれます。

私の構文はどのように間違っていますか? これは不可能ですか?

================== より明確にするために編集 ==================

static interface AnInterface<Return, Param1> {
    public Return method(Param1 obj1);
}

private static <T,V> AnInterface<V, V> returnPlease(T<V> obj) {
    return new AnInterface<V, V>() {
        public V method(V v) {
            // Do something
            return null;
        }
    };
}

これで少しは理解が深まると思います...

4

1 に答える 1

5

これは意味がありません。つまり、 aComparable<V> またはaSet<V> またはaThreadLocal<V>で問題ありませんが、それらに共通しているのは、それぞれに型パラメーターがあるということだけですか?

あなたは「Collection インターフェイスに集中しないでください」と書きましたが、それが唯一の選択肢だと思います。Collection<V>型パラメータを意味のあるものにするには、「実装」などの特定の意味のある要件が必要です。たとえば、次のように記述できます。

static interface AnInterface<Return, Param1> {
    public Return method(Param1 obj1);
}

private static <V, T extends Collection<? extends V>> AnInterface<V, V> returnPlease(T obj) {
    return new AnInterface<V, V>() {
        public V method(V v) {
            // Do something
            return null;
        }
    };
}

そして Java は実際には十分スマートで、渡す引数の型から と の両方を推測できるので、次のように書くことができますTV

AnInterface<String, String> x = returnPlease(new TreeSet<String>());
于 2012-08-24T15:09:37.303 に答える