每日一题:Java基础之范型擦出

191 阅读1分钟

1.请问,上面代码最终结果输出的是什么?

Class c1 = new ArrayList<String>().getClass();

Class c2 = new ArrayList<Integer>().getClass();

System.out.println(c1.getName());
System.out.println(c2.getName());
System.out.println(c1 == c2);
System.out.println(c1.equals(c2));
请思考后点击查看正确答案及题解
首先公布正确答案:
java.util.ArrayList
java.util.ArrayList
true
true
上面的代码中涉及到了泛型,而输出的结果缘由是类型擦除。

2.请问,一个Integer的ArrayList可以添加一个String类型吗,如何操作?

请思考后点击查看正确答案及题解
首先公布正确答案:可以
同样是利用Java类型擦除的原理,用反射的手段就绕过了正常开发中编译器不允许的操作限制。

3.代码参考

public class Test02 {
    public static void main(String[] args) {
        Class c1 = new ArrayList<String>().getClass();

        Class c2 = new ArrayList<Integer>().getClass();

        System.out.println(c1.getName());
        System.out.println(c2.getName());
        System.out.println(c1 == c2);
        System.out.println(c1.equals(c2));
        System.out.println("--------------------------------");

        // ArrayList添加一个其他类型
        ArrayList<Integer> s = new ArrayList<>();
        s.add(1);

        try {
            Method method = s.getClass().getDeclaredMethod("add", Object.class);
            method.invoke(s, 2);
            method.invoke(s, "a");
            method.invoke(s, false);
        } catch (Exception e) {
            e.printStackTrace();
        }
        for (Object o : s) {
            System.out.println(o);
        }

    }
}
请点击查看log输出
java.util.ArrayList
java.util.ArrayList
true
true
--------------------------------
1
2
a
false