A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hanrongle 中级黑马   /  2013-8-19 08:22  /  1207 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天在博客里看到有关泛型遇到重载的问题
问题是这样的 例子1:
public void method(List<String> list){}
public void method(List<Integer> list){}
这两个方法写在同一类中会报错,该作者认为在编译期间都变成了List<E>因此违背了重载规则
这个是暂时还没有疑问,但是又说 例子2:
public void method(List<String> list){}
public int method(List<Integer> list){}
把返回值类型改了就不会报错了,该作者认为在编译期间class文件认为是方法签名一致但是返回值类型不同依然是不同的两个方法,所以不会报错
可是 照这个说法,例子3:
public void method(List<String> list){}
public int method(List<String> list){}
这个写法就错了 ,但是我依然用方法签名一样但是返回值类型不同解释就解释不清了,
到底怎么回事呢?例子2不违背重载,但是例子3却违背了重载,为啥?

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

5 个回复

倒序浏览
重载是指在同一类中,方法名称相同 参数的个数或者类型不同,
方法二里面参数类型分别为Integer和String集合 所以不违背
方法三都 相同所以违背了。
其原理可想而知:当你传入一个参数和方法体时,如果有两个方法可选择而返回值类型不同,这样就错误了。

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

回复 使用道具 举报
使用重载要注意以下的几点:

1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。
回复 使用道具 举报
不能通过编译的原因就是在不能重载上,但实例3的两个方法又确实存在于同一个class文件中,之所以编译报错,是因为后续使用的问题
因为你有两个返回值,如果你返回int,void方法会报错,如果你不返回,int函数会报错,举个简单的例子:
public class text {

        public void method(List<String> list){System.out.println("a");}
        public int method(List<Srting> list){return 1;}
        public static void sop(Object o){
                System.out.print(o.toString());
        }
        public static void main(String[] args)
        {
                text t=new text();
                t.method(new ArrayList<String> ());
                sop(t.method(new ArrayList<String> ()));
        }
}

这个提示的错误可不是Method test(List<String>) has the same erasure test(List<E>) ,不是类型相同哦
而是The method sop(Object) in the type text is not applicable for the arguments (void),是使用时类型匹配的问题
这就是不能依据返回值不同去重载函数的真正原因。
至于那篇博客讲的:java代码中,函数的特征签名仅仅包括方法名称、参数类型以及参数顺序。但在字节码中,特征签名还包括了方法的返回值以及受查异常表,这就是为什么在class文件中,其他都相同仅仅返回值不同的两个方法能共存的原因。我想能存在和能使用可能是两回事。

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

回复 使用道具 举报
public void method(List<String> list){}
public void method(List<Integer> list){}

public void method(List<String> list){}
public int method(List<Integer> list){}
以上两个均会报错,你可以在eclipse下试下,让编译器告诉你
以上均是因为泛型擦除为原始类型->List

public void method(List<String> list){}
public int method(List<String> list){}
编译器认为重名方法,也是错误的
回复 使用道具 举报
我也觉得123都会报错
首先1在编译时擦除掉泛型后就是两个相同的方法 肯定会报错
23返回值类型不同不构成重载 方法重名也会报错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马