我正在尝试传递
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>>> variable
给期望的超类构造函数:
Map<String, Map<String, List>>
我尝试将父类的构造函数更改为期望
Map<String, Map<String, List<?>>>
and
Map<String, Map<String, ? extends List>>
如果我理解正确,您可以更改超类构造函数的签名;您只需要使用接受任意值的东西来代替List
元素类型?
那应该是Map<String,?extends Map<String,?extends List<?>>>
。
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);
}
问题在于捕获转换不递归应用:
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 {
}