黑马程序员技术交流社区
标题:
当泛型,多态,重载纠缠到一起
[打印本页]
作者:
许冉
时间:
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