gpt4 book ai didi

java - 对于类型T的方法,它的 'inferred'类型应该是什么当它需要两个<? super T> 争论?

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

hamcrest库中有一个方法:

package org.hamcrest.core

...

public static <T> Matcher<T> allOf(Matcher<? super T> first, Matcher<? super T> second) {
List<Matcher<? super T>> matchers = new ArrayList<Matcher<? super T>>(2);
matchers.add(first);
matchers.add(second);
return allOf(matchers);
}

在我的代码中,我用 first 调用这个方法正在Matcher<Object>second正在Matcher<SomeException> .

现在:

  • 当我用带有 1.6 目标的 Eclipse 编译它时,它生成 <T> Matcher<SomeException> .
  • 当我用带有 1.6 目标的 javac 1.7 编译它时,它生成 <T> Matcher<SomeException> .
  • 当我用带有 1.6 目标的 javac 1.6 编译它时,它生成 <T> Matcher<Object>

问题是,什么<T>应该是这种情况吧?

我的理解是,javac 1.6 中有一个错误,应该是Matcher<SomeException>。 ,因为这是输入参数的常见类型(SomeException 是 Object 的子类型),然后 100% 确定,返回的 Matcher 将为 Matcher<SomeException> .

我说的对吗?有没有办法强制 javac 1.6 正常运行?

最佳答案

编译器会执行 inference based on actual arguments .它将以 Matcher<Object> << Matcher<? super T> 的初始约束开始。和 Matcher<SomeException> << Matcher<? super T> .从中它将推断出约束 T << ObjectT << SomeException . Object minimal erased candidate set时将被淘汰被构造。剩余人选SomeException将(最终:D)替换为T .

到目前为止,我们已经展示了 eclipse 和 JDK7 在这种情况下的正确行为。我不认为有任何方法可以强制 javac 也正确运行。您可以显式声明类型参数或使用 JDK7(将源和目标指定为 6)。

关于java - 对于类型T的方法,它的 'inferred'类型应该是什么当它需要两个<? super T> 争论?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15269856/

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