泛型列表<字符串>和列表<整数>行为不符合预期

2022-09-02 12:16:16

为什么打印“tom”并且在强制转换为 后未显示任何运行时异常,而在强制转换为 后无法打印值 1?printlnList<Integer>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
    }
}

答案 1

的第一个调用静态调度到 ,第二个调用调度到 。因此,对于第二个调用,编译器会放置一个隐式强制转换,然后在运行时失败。printlnPrintStream.println(Object)PrintStream.println(String)StringClassCastException


答案 2

这里的问题是java编译器在编译时而不是运行时选择方法。在编译时,它将选择方法PrintStream.print(String),而不是PrintStream.print(int)PrintStream.print(Object),两者都会成功。