gpt4 book ai didi

java - 为什么局部变量会影响类型推断等式约束?

转载 作者:搜寻专家 更新时间:2023-11-01 03:46:44 24 4
gpt4 key购买 nike

我无法理解类型推断中的捕获。我有一些看起来像这样的代码:

import java.util.EnumSet;

class A {
static enum E1 {
X
}

private static <T extends Enum<T>> EnumSet<T> barEnum(Class<T> x) {
return null;
}

private static void foo1(EnumSet<E1> s, E1 e) {
EnumSet<E1> x2 = barEnum(e.getClass());
}

private static void foo2(EnumSet<E1> s) {
EnumSet<E1> x = barEnum(s.iterator().next().getClass());
}
}

编译时出现两个错误:

Test.java:15: error: method barEnum in class A cannot be applied to given types;
EnumSet<E1> x2 = barEnum(e.getClass());
^
required: Class<T>
found: Class<CAP#1>
reason: inference variable T has incompatible equality constraints E1,CAP#2
where T is a type-variable:
T extends Enum<T> declared in method <T>barEnum(Class<T>)
where CAP#1,CAP#2 are fresh type-variables:
CAP#1 extends E1 from capture of ? extends E1
CAP#2 extends E1 from capture of ? extends E1
Test.java:19: error: method barEnum in class A cannot be applied to given types;
EnumSet<E1> x = barEnum(s.iterator().next().getClass());
^
required: Class<T>
found: Class<CAP#1>
reason: inference variable T has incompatible equality constraints E1,CAP#2
where T is a type-variable:
T extends Enum<T> declared in method <T>barEnum(Class<T>)
where CAP#1,CAP#2 are fresh type-variables:
CAP#1 extends E1 from capture of ? extends E1
CAP#2 extends E1 from capture of ? extends E1
Note: Test.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 errors

在尝试理解错误时,我更改了 foo2 以捕获局部变量中 getClass() 的值以查看实际类型:

private static void foo2(EnumSet<E1> s) {
// this works
Class<? extends Enum> c = s.iterator().next().getClass();
EnumSet<E1> y = barEnum(c);
}

现在,错误消失了,代码被编译了。我不明白引入一个与表达式类型完全相同的局部变量如何改变类型推断算法并解决问题。

最佳答案

当您将 s.iterator().next().getClass() 分配给局部变量时,您使用的是原始类型 - Enum。这就是您克服编译错误但收到警告的方法。

如果您改用强制转换,您可以在没有局部变量的情况下获得相同的行为:

private static void foo2(EnumSet<E1> s) {
EnumSet<E1> x = barEnum((Class<? extends Enum>)s.iterator().next().getClass());
}

您可以通过以下方式避免转换:

private static void foo2(EnumSet<E1> s) {
EnumSet<E1> x = barEnum(s.iterator().next().getDeclaringClass());
}

关于java - 为什么局部变量会影响类型推断等式约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48538370/

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