关于重构觉得不妥的地方

Zemo 发布于 2014/10/05 01:17
阅读 963
收藏 5
今天看《Think in Java》一书中,看到重载部分,讨论到重载方法只能通过参数不同、顺序不同等方法,但是如果返回值不同就不可以,因为首先程序无法判断需要调用哪个方法,其次如果不需要这个返回值的时候就区分不出来了,所以JAVA不允许以这种方法定义重载大概意思如下:
public Class Test(){
   Class A{
      int A(){return 1;}
      void A(){}
   }
   public static void main(Strnig[] args){
      A();
   }
}

这样谁也分不清调用的是哪个方法,所以不允许这样重载,但是如下代码就可以:

public class InitializeTestNull {

    static int test(Object... objects){return 1;}
    static int test(Object object){return 2;}

    public static void main(String[] args) {
        test(new Object());
    }
    
}

但是这样同样对于读者来说还是说不清是调用的哪个方法,但是运行的话返回结果是2,默认调用的第二个方法。

这让我想不通,求大神解惑。

加载中
0
拐角的蟑螂
拐角的蟑螂

俩个方法要求的参数不一样吧,上面那个貌似要的是数组,下面那个要的是对象。写个代码测试一下就知道了

0
魔法刀客
魔法刀客

引用来自“拐角的蟑螂”的评论

俩个方法要求的参数不一样吧,上面那个貌似要的是数组,下面那个要的是对象。写个代码测试一下就知道了

不是貌似,应该说就是上面那个就是数组。
0
Zemo
Zemo
我明白意思,所以才会这样写。我只是说但从调用的角度讲,这样调用的话读者是区分不出来调用的是哪个方法,为什么会允许这样的存在。
m
magiclogy
有时候,几个函数在语义上是一致的,所以采用相同的名称比较合适。
0
firebroo
firebroo

static int test(Object... objects){return 1;}

这个应该是匹配2个及以上Object类型的参数,而

static int test(Object object){return 2;}

这个匹配是一个Object类型的参数,这种"怪异"的写法其实就是一个模式匹配。至于java为啥支持这种写法,我也是第一次看到,这种写法或许是参考的scheme,因为scheme在模式匹配的时候就是这么写的。

0
Hassan
Hassan
其实理解成数组就比较好接受了。
0
Zemo
Zemo

其实我只是想说两个问题。

一个是就test(new Object);就这个调用而言,对于读者,可读性太差,JAVA不应该允许这样的情况存在,

《Think in Java》一书,P82,5.2.3以返回值区分重载方法
中有解释为什么不能以返回值区分重载方法,


同理,如上代码应该也不允许存在,

    问题二:

    为什么test(new Object());就调用了“return 2;”这个方法,明显两个方法都符合条件。

firebroo
firebroo
调用方法的时候,如果能够和固定参数的方法匹配,也能够与可变长参数的方法匹配,则选择固定参数的方法。你可以想象成switch case最后的那个default,这个default就是个万能匹配,而你的可变长Object类型参数也是个万能匹配,万能匹配一般在模式匹配会放到最后来保证模式匹配的正确性,这样解释应该可以理解了。
0
Steve
Steve
重载这种东西早应该被抛弃了,就一个理由,容易引起混乱和误解。起一个新的方法名就好了,何必玩花式把自己玩进去。简单即美。
鱼十三
鱼十三
起名字好难的啊,要不就得加一些丑陋的如 fun1 fun2 这样的
0
Left-Shift
Left-Shift
编译器会把 Object...当作数组来处理,所以编译没问题。当调用方法的时候,能匹配定长参数的方法,优先匹配该方法,含有不定参数的那个重载方法是最后被选中的
0
j
jssunhao
话说这么设计没问题吗?
0
l
longzz
大哥~ 前面貌似介绍了 object... 干嘛的吧?
返回顶部
顶部