登录  /  注册
java - 为什么方法返回值不算作方法签名?
怪我咯
怪我咯 2017-04-17 17:28:41
[Java讨论组]

为什么方法返回值不算作方法签名?这样设计的原因是什么?不知道原因,我永远都记不住啊……


附:
1、方法签名定义
Definition: Two of the components of a method declaration comprise the method signature—the method's name and the parameter types.
The signature of the method declared above is:

2、方法签名例子
calculateAnswer(double, int, double, double)

http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(2)
PHP中文网

@chenhengqi 的回答看似很有道理,其实仔细想想是讲不通的。

首先,参数也存在误匹配的问题,比如:

class Foo {
    void m(String s) {} // 1
    void m(Object o) {} // 2
}

Foo foo = new Foo();
String s = "xxx";
foo.m(s); // 这个肯定会调用方法1,没问题
Object o = s;
foo.m(o); // 虽然o的实际类型为String,但调用的却是方法2

Object o2 = null;
foo.m(o2); // 调用的是方法2,怎么才能让它调用方法1呢?
foo.m((String) o2); // 强转一下才能调用方法1

通过上面的例子看出来了,作为方法签名一部分的参数类型也是会引起歧义的。

其次,假如Java把返回值作为方法签名的一部分,我们也是可以避免歧义的。比如下面的假想代码:

// imaginary code

class Foo {
    String m() {} // 1
    Object m() {} // 2
}

// 调用时:
Foo foo = new Foo();
(String) foo.m(); // 通过强转来消除歧义
foo.m(); // 默认情况下调用最宽的那个方法,即方法2,当然也可以(Objet) foo.m();

所以,返回值类型可能会引起歧义这个说法是站不住脚的,如果这样的话那参数也应该仅靠数量来区分,而不是现在的数量+类型。(而且不管你信不信,JVM里面的方法签名的确是包括返回值类型的

所以回到这个问题上来,我认为之所以Java编译器把返回值类型排除在方法签名之外,有以下几点原因:

  1. 降低复杂度。否则,在不需要返回值的地方也需要加入强转来声明要调用的到底是哪个方法

  2. 减少错误。想想因为参数的类型而导致的逻辑错误吧(本该调用方法1的却调用了方法2),如果再加一个返回值的类型……

  3. 最根本的原因,还是Java设计人员认为返回值不应该成为方法签名的一部分,这样会增加滥用和过度设计等不良现象。就像Java禁止多重继承一样,并不是不能,而是不好。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号