Java泛型类型推断

时间:2012-07-11 17:36:08

标签: java generics wildcard type-inference

我想传递

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

到超类的构造函数,期望:

Map<String, Map<String, List>>  

我尝试将父类的构造函数更改为

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

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

无济于事。

3 个答案:

答案 0 :(得分:5)

如果我理解正确,你可以改变超类构造函数签名;你只需要接受List元素类型的任意值的东西吗?

应该是Map<String, ? extends Map<String, ? extends List<?>>>

答案 1 :(得分: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);
}

答案 2 :(得分:0)

问题是捕获转换不是递归应用的:

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

所以'?'在嵌套&lt; &GT;被捕获转换被忽略

一种方法(虽然从泛型中获取任何价值的观点来看并不完全令人满意)使你的代码工作就是做类似的事情:

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 {
}