当前位置:  开发笔记 > 编程语言 > 正文

如果我们应用类型擦除,将在运行时调用哪些重载方法,为什么?

如何解决《如果我们应用类型擦除,将在运行时调用哪些重载方法,为什么?》经验,为你挑选了0个好方法。

假设我们有以下泛型类

public class SomeType {
    public  void test(Collection collection){
        System.out.println("1st method");

        for (E e : collection){
            System.out.println(e);
        }
    }

    public void test(List integerList){
        System.out.println("2nd method");

        for (Integer integer : integerList){
            System.out.println(integer);
        }
    }

}

现在在main方法中我们有以下代码片段

SomeType someType = new SomeType();
List list = Arrays.asList("value");
someType.test(list);

作为执行的结果,someType.test(list)我们将在我们的控制台中获得"第二种方法" java.lang.ClassCastException.据我所知,为什么第二种test方法被执行的原因是我们不使用泛型SomeType.因此,编译器会立即从类中删除所有泛型信息(即两者).在做完第二个test方法后,它将List integerList作为一个参数,当然比to List更好.ListCollection

现在考虑在main方法中我们有以下代码片段

SomeType someType = new SomeType<>();
List list = Arrays.asList("value");
someType.test(list);

在这种情况下,我们将在控制台中获得"第一种方法".这意味着第一个测试方法正在执行.问题是为什么?

根据我对运行时的理解,由于类型擦除,我们从来没有任何泛型信息.那么,为什么第二种test方法无法执行.对我来说第二种test方法应该是(在运行时)以下面的形式public void test(List integerList){...}不是吗?

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有