泛型列表<String>和List <Integer>的行为不符合预期

Ama*_*man 19 java generics list arraylist

为什么println打印"tom"并且在转换后没有显示任何运行时异常List<Integer>,而它在转换后无法打印值1 List<String>

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String args[]) {

        List list = Arrays.asList(1, "tom");

        System.out.println(((List<Integer>) list).get(1));
        // "tom"

        System.out.println(((List<String>) list).get(0));
        // ClassCastException: Integer cannot be cast to String
    }
}
Run Code Online (Sandbox Code Playgroud)

Zhe*_*lov 34

第一个调用println是静态调度到PrintStream.println(Object),第二个调用被调度到PrintStream.println(String).因此,对于第二次调用,编译器会将一个隐式强制转换置于运行时String失败ClassCastException.

  • 没有'PrintStream.println(Integer)`.编译器始终调度到具有最特定签名的方法.`Integer`最具体的类型是`Object`,`String`最特殊的类型是`String`. (7认同)
  • 你能详细说明一下吗,bcoz我认为在第一种情况下,如果第二种情况为PrintStream.println(String),或者两种shud都有PrintStream.println(Object),那么它会去PrintStream.println(整数). (2认同)