4

合格しようとしています

Map<String, Map<String, List<TranslationImport>>> variable

以下を期待するスーパークラスのコンストラクターへ:

Map<String, Map<String, List>>  

親クラスのコンストラクターを変更してみました

Map<String, Map<String, List<?>>> 

Map<String, Map<String, ? extends List>> 

無駄に。

4

3 に答える 3

5

私の理解が正しければ、スーパークラス コンストラクターのシグネチャを変更できます。List要素タイプの任意の値を受け入れるものが必要ですか?

それはおそらくそうあるべきMap<String, ? extends Map<String, ? extends List<?>>>です。

于 2012-07-11T18:38:02.227 に答える
1

たぶん、これは少し「役立つ」でしょう

static void test(Map<String, Map<String, List>> m) {
    System.out.println(m);
}
public static void main(String[] args) {
    Map<String, Map<String, List<TranslationImport>>> variable = new HashMap<String, Map<String, List<TranslationImport>>>();
    Map<String, Map<String, List>> m2=(Map)variable;
    test(m2);
}
于 2012-07-11T17:44:08.323 に答える
0

問題は、キャプチャ変換が再帰的に適用されないことです:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.10

それで '?' ネストされた < > 内は、キャプチャ変換では無視されます

コードを機能させる 1 つの方法 (ジェネリックから値を取得するという観点からは完全に満足できるものではありませんが) は、次のようにすることです。

import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

public class Foo extends FooParent {
    Foo(Map<String, Map<String, List<TranslationImport>>> variable) {
        super(variable);
        System.out.println("ok");
    }
    public static void main(String[] args) {
        Map<String, Map<String, List<TranslationImport>>> var =
            new HashMap<String, Map<String, List<TranslationImport>>>();
        Foo foo = new Foo(var);
    }
}

class FooParent {
    FooParent(Map<String, ?> variable) {
        System.out.println("FooParent constructor");
    }
}

class TranslationImport {
}
于 2012-07-11T18:37:50.367 に答える