黑马程序员技术交流社区

标题: 当泛型,多态,重载纠缠到一起 [打印本页]

作者: 许冉    时间: 2011-10-12 14:17
标题: 当泛型,多态,重载纠缠到一起
如题,晕了@
一,多态与重载
classTest{
public static void main(String[] args){
        List<String> l1= new ArrayList<String>();          
        ArrayList<String> l3  = new ArrayList<String>();
                                        
        method(new ArrayList<String>());  //输出第一个
        method(l1);                                 //调用第二个 ,为什么和上一句不一样呢???
        method(l3);                                    //输出第一个

}   
public static void method (ArrayList<String> cl){}
public static void method (List<String> cl){}
}

二,泛型与重载,如果这么写
public static void method (List<Integer> cl){}
public static void method (List<String> cl){}
上面两个方法会报错,应该不算重载,是不是说明编译时忽略了泛型参数
但是如果是下面的写法,是不是说明编译时检查了泛型参数,这不是很矛盾吗???
public class Test {
       public static void main(String[] args){      
                 ArrayList<String> l2  = new ArrayList<String>();
                 ArrayList<Integer> l3  = new ArrayList<Integer>();
                 method(l2);      //调用了第二个
                 method(l3);      //调用了第一个
        }   
                public static void method (ArrayList<Integer> cl)
                {
                        System.out.println("AS");
                }
                public static void method (List<String> cl)
                {
                        System.out.println("LS");
                }
               
}       
作者: 张洋铭    时间: 2011-10-12 15:28
一. 重载和多态那个没什么迷糊的
你这其实就是个传参的问题。method重载了2组参数,第一个是ArrayList实现类,类型的参数,第二是List接口,类型的参数。l1是接口型变量(引用接口实现类对象是必须的)就跑接口参数的方法里去,l3是ArrayList类型变量就跑ArrayList参数的方法里去,这俩变量走的不是一个方法。

二. 重载与泛型那个
不得不说,这其实还是传参的问题........
List是接口类型,你把接口当参数,那这个参数能接受的东西只有一种:就是该接口的实现类。
ArrayList<String> l2  = new ArrayList<String>();
ArrayList<Integer> l3  = new ArrayList<Integer>();
这两个都是LIST的实现类对象,都能往List里传,不过你List泛型限定只能传String的就把l2传进去了。

关于
public static void method (List<Integer> cl){}
public static void method (List<String> cl){}
泛型是泛型,不是类型! 重载是参数列表中的参数类型不同,不是泛型不同~~~你这里类型是相同,无法重载。
作者: 朱华    时间: 2011-10-12 23:29
首先要明确一个问题,在你的标题中,
泛型指的是参数化类型,即你可以为你要操作的类型指定特定的参数,而不用在以后的使用中强制转码,后者的做法隐患是当别人调用或修改你的代码时,会有可能出现运行时异常并难以发现
多态指的是同一个名字的方法却表示不同的语义,各自执行自己相应的方法体。JAVA的多态常见于继承关系中,表现形式一般来说有两种,一个是重写,另一个是标题提到的重载。


所以对于第一个问题,method()明显是被重载了,因为List是一个接口,而ArrayList是一个实现了List接口的一个类,而用 List<String> l1= new ArrayList<String>(); 这样的语法创建以后,l1将缺少ArrayList的一些属性和方法,它与完全属于ArrayList的l3是完全不同的两种形态。故method(l1);与method(l3);走的方法必然会不同。

对于第二,
public static void method (List<Integer> cl){}
public static void method (List<String> cl){}
无论参数List的泛型如何,他都是一个List类型,而重载需要的是参数类型不同,但他们是相同的。

对于
public static void method (ArrayList<Integer> cl)
public static void method (List<String> cl)
同第一条的原理,很明显的,两个method拥有两个不同的参数类型,当传递的参数不同时,必然会调用不同的方法。


作者: 梁锡伟    时间: 2011-10-13 18:53
不是觉得世界真美好吗??




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2