gpt4 book ai didi

java - javac 和 ecj 的不同类型推断结果

转载 作者:太空宇宙 更新时间:2023-11-04 11:46:54 25 4
gpt4 key购买 nike

我对 Java 的类型推断有疑问。我使用的是 javac 1.8.0_121,以下代码可以使用 Eclipse ECJ 进行编译,但不能使用 javac

import java.util.function.Function;

public class Playbook {

static class A {
}

static class B {
}

static class P<T> {
}

static class V<T> {
static <T, U> V<U> m(P<T> src, Function<? super T, ? extends U> f, Function<? super U, ? extends T> g) {
return null;
}

void b(final P<T> other) {

}
}

public void bindTimeString1(P<A> p1, P<B> p2) {
V.m(p2, s -> new A(), t -> new B()).b(p1);
}
}

使用 javac 编译它会导致以下错误:

[ERROR] Playbook.java:[31,47] incompatible types: main.java.Playbook.P<main.java.Playbook.A> cannot be converted to main.java.Playbook.P<java.lang.Object>

如果没有 m 的第二个参数 g,代码编译不会出现问题:

导入java.util.function.Function;

public class Playbook {

static class A {
}

static class B {
}

static class P<T> {
}

static class V<T> {
static <T, U> V<U> m(P<T> src, Function<? super T, ? extends U> f) {
return null;
}

void b(P<T> other) {

}
}

public void bindTimeString2(P<A> p1, P<B> p2) {
V.m(p2, s -> new A()).b(p1);
}
}

我不明白为什么这首先会失败。从代码中,编译器可以推断出:

  • f 返回扩展 U 的内容。
  • g 接受 U 的基类。
  • 从 g 的 body 中无法推断出有关 U 的更多信息。
  • 从 f 的主体中,它知道它返回一个 A,因此 A <: U 必须为 true。
  • Var.b 不再对 U 施加任何限制,因此 U 可以是满足 A <: U 的任何类型。在这种情况下,这使我们将 A 或 Object 作为 U 的潜在候选者。

看起来,当 g 存在时,编译器会选择 Object,而当 m 为一元时,编译器会选择 A,尽管 g 没有添加任何有关 U 的内容。

我也很困惑这是否是 ECJ 或 javac 中的问题,因为 ECJ 接受代码而 javac 不接受。只有其中之一是正确的。

最佳答案

我还没有发现任何引用问题,但当前的 Java 9 早期访问版本编译代码时没有错误。由此我得出的结论是,这是 Java 8 中的问题,而不是 ECJ 中的问题。

关于java - javac 和 ecj 的不同类型推断结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42271471/

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