Java泛型类型推断

4

我正在尝试传递

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

给期望的超类构造函数:

Map<String, Map<String, List>>  

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

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

and

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

无济于事。

如果你尝试这样写:Map<String, Map<String, List<TranslationImport>>> - Razvan
4
修改超类以正确使用泛型! - Louis Wasserman
@LouisWasserman 如果你指的是将List绑定到特定类型,那不是一个选项。 - mkvcvc
3个回答

5

如果我理解正确,您可以更改超类构造函数的签名;您只需要使用接受任意值的东西来代替List元素类型?

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


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);
}

0

问题在于捕获转换不递归应用:

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

在嵌套的 < > 中,'?' 会被忽略以进行捕获转换。

一种使您的代码工作的方法(虽然从泛型获取任何值的角度来看并不完全令人满意)是执行以下操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接