首页 > 试题广场 >

下面程序输出是? public class Main {

[单选题]
下面程序输出是?
public class Main {
    public static void main(String[] args) {
        ArrayList<String> l1 = new ArrayList<String>();
        ArrayList<Integer> l2 = new ArrayList<Integer>();
        l1.add("1");
        l2.add(1);
        System.out.println(l1.get(0).getClass());
        System.out.println(l2.get(0).getClass());
        System.out.println(l1.getClass() == l2.getClass());
    }
}

  • class java.lang.Object
    class java.lang.Object
    true
  • class java.lang.Object
    class java.lang.Object
    false
  • class java.lang.String
    class java.lang.Integer
    true
  • class java.lang.String
    class java.lang.Integer
    false
Java 中泛型在编译时会进行类型擦除,因此l1和 l2 类型擦除后的结果都是 java.util.ArrayLis ,进而 l1.getClass() == l2.getClass() 的结果是 true
发表于 2019-12-05 16:09:36 回复(1)
1. 类型擦除的概念 - 类型擦除是Java泛型中的一个重要概念。简单来说,Java中的泛型在编译阶段是有效的,编译器会根据泛型类型进行类型检查等操作,但是在运行时,泛型类型信息会被擦除。 - 例如,在代码 ArrayList<string> 和 ArrayList<integer> 中,在编译时它们是不同类型的 ArrayList (因为泛型类型不同),编译器会确保你不能把错误类型的元素放入相应的集合中(比如不能把 Integer 放入 ArrayList<string> )。 2. 运行时的情况 - 然而,当程序运行时, ArrayList<string> 和 ArrayList<integer> 的类型信息中的泛型部分会被擦除,它们在运行时都被视为原始的 ArrayList 类型(即 class java.util.ArrayList )。这就是为什么 l1.getClass() == l2.getClass() 会返回 true ,因为在运行时它们的类对象是相同的,只是在编译时通过泛型提供了额外的类型检查功能来增强程序的安全性和可读性。 - 再比如,你不能在运行时通过反射等方式获取到一个 ArrayList 对象在编译时声明的泛型具体类型(如 String 或 Integer ),因为这些泛型类型信息在运行时已经被擦除了。类型擦除机制使得Java的泛型实现能够在不增加太多运行时开销的情况下提供泛型功能。</integer></string></string></integer></string>
发表于 2024-11-11 13:11:32 回复(0)