将对象的列表转换为类的类型参数列表

gda*_*ski 5 java eclipse generics casting

我正在尝试理解看似类似代码的不同编译结果.似乎有可能将a转换List<Object>为a,List<T>但仅限于T不受具体类限制.所以......

List<Object> bis = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

在下面的编译class Test<T>,以及在class Test<T extends CharSequence>,但不是class Test<T extends BigDecimal>也不class Test<T extends BigDecimal & CharSequence>.

List<T> result = (List<T>) bis;
Run Code Online (Sandbox Code Playgroud)

那么,T与类型和接口类型相关的区别在哪里呢?

编辑:

每个请求一些完整的代码.这将在第9行编译一个编译器警告.对于result像对象中的CharSequence结果实例进行操作一样,确实不安全ClassCastException.

    public class Sandbox<T extends CharSequence> {

    public static void main(String[] args) {
        new Sandbox<CharSequence>().foo();
    }

    private void foo() {    
        List<Object> bis = Arrays.asList(Integer.valueOf(1));
        List<T> result = (List<T>) bis;
        System.out.println(result);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这根本不编译:

    public class Sandbox<T extends BigDecimal> {

    public static void main(String[] args) {
        new Sandbox<BigDecimal>().foo();
    }

    private void foo() {    
        List<Object> bis = Arrays.asList(Integer.valueOf(1));
        List<T> result = (List<T>) bis;
        System.out.println(result);
    }

}
Run Code Online (Sandbox Code Playgroud)

第9行中的编译器错误:无法转换List<Object>List<T>.

Ram*_*lfc 0

好吧,这List<Object> bis = Arrays.asList(Integer.valueOf(1));显然不会编译,因为Arrays.asList(Integer.valueOf(1))会返回List<Integer>,这就是你得到的原因 Cannot cast List<Object> to List<T>

第二种情况,eclipse 荒谬地编译,T extends CharSequence但我检查了在线编译器,它没有编译,所以很可能这是一个 eclipse bug。