泛型类型推断失败?

多基因润滑剂:

例子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()任何参数化Set类型都适用。

艾伦·盖林斯(Alan Geleynse):

您的第二次致电anyPair()没有任何方法来确定其类型,因此默认为<Object, Object>

编译器正在分解process(p, anyPair());并逐个处理。执行此操作时,需要先处理参数以确定它们的类型,然后在处理时可以使用它们process

在进行处理时anyPair(),没有适用于该作品的类型信息,因为它当时不知道它是其中的一部分process默认为<Object, Object>,然后在查看时导致类型不匹配process

您的第二个示例也发生了同样的事情。Collections.emptySet()需要自行处理,但无法确定所需的类型。

有两种解决方法:

首先是通过将编译器anyPair()存储在具有正确类型的临时变量中,以与第一次调用时相同的方式为编译器提供类型推断所需的信息

第二个(感谢@BalusC)是使用ExampleA.<String, Integer>anyPair()该语法显式设置所需的类型,而不必超出调用范围。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章