Java 代码在破坏返回类型的泛型约束的同时进行编译

Java 代码在破坏返回类型的泛型约束的同时进行编译,java,generics,Java,Generics,String不实现自动关闭,那么我们如何将方法“get”的结果分配给String呢?有人知道为什么它在Java8和Java11下编译吗?如果我将AutoCloseable与Integer之类的非接口类交换,则会得到预期的编译器错误 import java.util.ArrayList; import java.util.List; import org.junit.Test; public class FooTest { @Test public void myTest()

String不实现自动关闭,那么我们如何将方法“get”的结果分配给String呢?有人知道为什么它在Java8和Java11下编译吗?如果我将AutoCloseable与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);
    }
}

import java.util.ArrayList;
导入java.util.List;
导入org.junit.Test;
公务舱{
@试验
公共无效myTest(){
最终字符串结果=new Foo().get(0);
}
}
福班{
列表=新的ArrayList();
公共A get(int name){
返回(A)列表。获取(名称);
}
}

由于您没有显式提供类型参数,因此正在推断(请参阅)它允许
String
成为有效的返回类型之一

我假设它被解析为一个更宽松的类型(请参阅),考虑到它将被分配到的变量的类型和您声明的边界

差不多

String & AutoCloseable
Integer & AutoCloseable
<Anything Really> & AutoCloseable
字符串和自动关闭
整数&可自动关闭
&自动关闭
如果显式设置类型参数,则会发生更改

String autoCloseable = new Foo().<AutoCloseable>get(0);
String autoCloseable=new Foo().get(0);

导致编译错误。

我认为类型推断的结果是“一种既扩展字符串又实现自动关闭的类型”。我认为它没有考虑到字符串在进行类型推断时是最终的这一事实。因此,当我在泛型约束中使用接口时,返回类型有可能被分配给我的变量并实现给定的接口?如果字符串不是最终的。。。我想我明白了。非常感谢。