String 没有实现 AutoCloseable,那么我们如何将我的方法“get”的结果分配给一个 String?有谁知道为什么这会在 Java 8 和 11 下编译?如果我将 AutoCloseable 与非接口(interface)类(如 Integer)交换,则会出现预期的编译器错误。
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
public class FooTest {
@Test
public void myTest() {
final String result = new Foo().get(0);
}
}
class Foo {
List<AutoCloseable> list = new ArrayList<>();
public <A extends AutoCloseable> A get(int name) {
return (A) list.get(name);
}
}
最佳答案
由于您没有明确提供类型参数,因此它被推断(参见 Type Inference )允许 String
成为有效的返回类型之一。
考虑到将要分配给的变量的类型和您声明的边界,我认为它被解析为更宽松的类型(请参阅 AdditionalBound
)。
就像是
String & AutoCloseable
Integer & AutoCloseable
<Anything Really> & AutoCloseable
如果您明确设置类型参数,它会发生变化
String autoCloseable = new Foo().<AutoCloseable>get(0);
导致编译错误。