gpt4 book ai didi

java - 泛型类型推断失败?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:47:31 34 4
gpt4 key购买 nike

例子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 类型。

最佳答案

您第二次调用 anyPair()没有任何方法可以确定它的类型,因此它默认为 <Object, Object> .

编译器正在中断 process(p, anyPair());分成几部分并单独处理。当它这样做时,它需要首先处理参数以确定它们的类型,然后可以在处理 process 时使用。 .

当它进入流程时 anyPair()该片段没有可用的类型信息,因为它不知道它是 process 的一部分在那时候。默认为 <Object, Object> ,然后在查看 process 时导致类型不匹配.

你的第二个例子也发生了同样的事情。 Collections.emptySet()需要自己处理,但无法确定需要的Type。

有两种方法可以解决这个问题:

首先是向编译器提供类型推断所需的信息,就像您第一次调用 anyPair() 时所做的那样。 ,通过将其存储在具有正确类型的临时变量中。

第二个(感谢@BalusC)是使用 ExampleA.<String, Integer>anyPair() .此语法显式设置所需的类型,而无需查看调用之外的内容。

关于java - 泛型类型推断失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4149825/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com