| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 811 人关注过本帖
标题:关于可变参数重载,模糊导致编译失败问题
只看楼主 加入收藏
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
关于可变参数重载,模糊导致编译失败问题
程序代码:
class test
{
    static void f (float a)
    {
        System.out.println("float");
    }
    static void f (Character a)
    {
        System.out.println("Character");
    }
}

public class Untitled
{
    public static void main(String[] args)
    {
        test.f ('a') ;
    }
}

如上的代码,编译没有问题,执行结果为:
float
//也就是说,编译器认为'a'更适合float
而如下代码:
程序代码:
class test
{
    static void f (float... a)
    {
        System.out.println("float");
    }
    static void f (Character... a)
    {
        System.out.println("Character");
    }
}

public class Untitled
{
    public static void main(String[] args)
    {
        test.f ('a') ;
    }
}

则提示编译错误,说参数'a'不明确,也就是说编译器分不清改传给哪个方法,但是上面的代码表示编译器认为比起Character,参数'a'更适合float,但是为什么到了可变参数的重载就说传参模糊,不知道该传给谁了呢?
2015-06-17 17:42
hhwz
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:87
帖 子:687
专家分:4502
注 册:2011-5-22
收藏
得分:0 
程序代码:

static void f (char... a)    //Character 改为char
    {
        System.out.println("Character");
    }

不是说'a'更适合float 'a'是一个char类型的 当找不到这个类型 就去找float 'a'是有对应的 ascii码的
2015-06-18 09:53
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
收藏
得分:0 
回复 楼主 果沫
可是为什么可变参数....编译器不会这么思考
2015-06-18 15:20
hhwz
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:87
帖 子:687
专家分:4502
注 册:2011-5-22
收藏
得分:0 
编译器是死的 人是活的 为什么要纠结编译器会不会思考
2015-06-18 16:23
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
收藏
得分:0 
回复 4楼 hhwz
......我只是这么阐述,意思就是在单参数时,编译器知道将参数传给float,为什么在可变参数时同样的参数类型,编译器就无法确定该将参数传给谁
2015-06-18 17:53
hhwz
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:87
帖 子:687
专家分:4502
注 册:2011-5-22
收藏
得分:0 
当然是这样的啊 什么类型的参数 由接收该类型的方法接受

假如你定义一个Object的参数那其他的方法是不是都没有用了呢 就是这个道理
2015-06-18 20:54
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
收藏
得分:0 
回复 6楼 hhwz
但是在单参数时,编译器能把参数传给float,为什么在可变参数时就不传给float了,如果说两种情况都出错那就没问题了,但是现在在单参数下可行,可变参数下不可行
2015-06-19 07:44
凌风zx
Rank: 8Rank: 8
来 自:万灵娱乐城
等 级:蝙蝠侠
威 望:7
帖 子:88
专家分:790
注 册:2015-4-11
收藏
得分:0 
我猜是这样的

可变参数可传单值,可传数组:

如果是单值的话他就该传float,但是并没有:这是不是说明可变参数优先选择数组传值

也就是说即使你传的单值他也看作是一个长度的数组

那么这就解释的通了:一个字符可以转Character 也可以转float,但是char数组转Character数组和float数组显然是不能的(因为数组是引用类型),那么问题来了他该把你传的数看成是
一个长度的Character数组呢? 还是一个长度的float数组呢?显然他并不知道

初出茅庐
2015-06-19 09:38
hhwz
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:87
帖 子:687
专家分:4502
注 册:2011-5-22
收藏
得分:20 
在单参数传递构造方法中  编译器是从选择从最小的数据类型 到最大来选择构造方法
但是在传递数组中就不能这样 你必须定义是什么类型的数组才能传递
2015-06-19 09:48
快速回复:关于可变参数重载,模糊导致编译失败问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025401 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved