实施例A
研究以下片段:
public class ExampleA {
static class Pair<F,S> { }
static <F,S> Pair<F,S> anyPair() { return null; }
static <F,S> void process(Pair<F,S> p1, Pair<F,S> p2) { return; }
public static void main(String[] args) {
Pair<String,Integer> p = anyPair();
process(p, anyPair()); // doesn't compile
}
}
有人可以解释为什么类型推断适用于局部变量的赋值p
但不适用于第二个实际参数process
?
实施例B
这或许更容易理解:
public class ExampleB {
public static <E> void process(Set<E> s1, Set<E> s2) { return; }
public static void main(String[] args) {
process(new HashSet<String>(), Collections.emptySet()); // doesn't compile
}
}
同样的问题:为什么不能编译?
我希望Collections.emptySet()
只会为ANY参数化的Set
type.
您第二次致电anyPair()
没有任何方法来确定它的类型,所以它默认为<Object, Object>
.
编译器正在崩溃process(p, anyPair());
分成碎片并单独处理。当它这样做时,它需要首先处理参数以确定它们的类型,然后在处理时可以使用它们process
.
当它进入处理阶段时anyPair()
该片段没有可用的类型信息,因为它不知道它是process
在那时候。它默认为<Object, Object>
,这会在查看时导致类型不匹配process
.
你的第二个例子也会发生同样的事情。Collections.emptySet()
需要自己处理,但是无法确定需要的Type。
有两种方法可以解决这个问题:
第一个是为编译器提供类型推断所需的信息,就像第一次调用一样anyPair()
,通过将其存储在具有正确类型的临时变量中。
第二个(感谢@BalusC)是使用ExampleA.<String, Integer>anyPair()
。此语法显式设置所需的类型,而无需查看调用之外的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)