【发布时间】:2013-10-09 21:44:41
【问题描述】:
我有这个方法(这是我原来问题的简化):
public List<AbstractMap.SimpleEntry<String, List<?>>> method(List<?> list) {
return Collections.singletonList(new AbstractMap.SimpleEntry<>("", list));
}
但是,这会导致编译错误:
Console.java:40: error: incompatible types return Collections.singletonList(new AbstractMap.SimpleEntry<>("", list)); ^ required: List<SimpleEntry<String,List<?>>> found: List<SimpleEntry<String,List<CAP#1>>> where CAP#1 is a fresh type-variable: CAP#1 extends Object from capture of ? 10 errors
如果我尝试在顶级方法上指定类型实例化:
return Collections.<AbstractMap.SimpleEntry<String, List<?>>>singletonList(new AbstractMap.SimpleEntry<>("", list));
我得到一个不同的错误:
Console.java:40: error: method singletonList in class Collections cannot be applied to given types; return Collections.<AbstractMap.SimpleEntry<String, List<?>>>singletonList(new AbstractMap.SimpleEntry<>("", list)); ^ required: T found: SimpleEntry<String,List<CAP#1>> reason: actual argument SimpleEntry<String,List<CAP#1>> cannot be converted to SimpleEntry<String,List<?>> by method invocation conversion where T is a type-variable: T extends Object declared in method <T>singletonList(T) where CAP#1 is a fresh type-variable: CAP#1 extends Object from capture of ? 10 errors
只有当我在 inner 方法上指定类型参数时,它才起作用:
return Collections.singletonList(new AbstractMap.SimpleEntry<String, List<?>>("", list));
我什至不假装理解这里发生了什么。我怀疑这与capture conversion(相关问题here)有关,但我不知道为什么在外部方法上指定泛型不起作用,但在内部方法上却可以。 java不使用返回类型来推断像这样的嵌套调用的类型参数吗?这是怎么回事?
【问题讨论】:
-
我不认为它是重复的。我最初只使用方法调用而不是构造函数遇到了这个问题。由于
<>的方法和构造函数使用相同的推理逻辑,因此我将其替换为复制原始问题的纯 JDK 版本。这个问题也主要是关于显式类型声明的位置差异,而不是推断任何东西。
标签: java generics type-inference