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);

导致编译错误。

10-07 22:31