黑马程序员技术交流社区

标题: 类型转换的疑惑 [打印本页]

作者: tanlei200620    时间: 2012-2-22 19:51
标题: 类型转换的疑惑
class Test3{
        public static void main(String[] args){
                Test3.add((short)3, 4);//无法通过编译
                Test3.add((short)3, 5.0f);//可以通过编译
        }
       
        public static int add(int a,float b){
                return(int)(a+b);
        }
        public static int add(float a,int b){
                return(int)(a+b);
        }
        public static int add(float a,float b){
                return(int)(a+b);
        }
}

基本类型提升只进行一次??
作者: 【专】【属】    时间: 2012-2-23 08:52
Test3.add((short)3, 4);//无法通过编译
应该是不可以通过的,因为没有一个add(int,int)的参数列表。


作者: 张红    时间: 2012-2-23 14:18
你看错误提示
The method add(int, float) is ambiguous for the type
ambiguous 是有歧义的意思
————————————————————————————————————————————————————————
class Test{
public static void main(String[] args) {
                /** 可以通过编译 - 调用的是方法一 */
                add((short) 3, 5.0f);

                /** 优先调用方法四 */
                add((short) 3, 4);

        }

        /**
         * 方法一
         *
         * @param int a
         * @param float b
         * @return int
         */
        public static float add(int a, float b) {
                System.out.println(" method 1 invoke ..");
                return (int) (a + b);
        }

        /**
         * 方法二
         *
         * @param float a
         * @param int b
         * @return int
         */
        public static int add(float a, int b) {
                System.out.println(" method 2 invoke ..");
                return (int) (a + b);
        }

        /**
         * 方法三
         *
         * @param float
         * @param float b
         * @return float
         */
        public static int add(float a, float b) {
                System.out.println(" method 3 invoke ..");
                return (int) (a + b);
        }

        /**
         * 方法四
         *
         * @param int
         * @param int b
         * @return int
         */
        public static int add(int a, int b) {
                System.out.println(" method 4 invoke ..");
                return (int) (a + b);
        }
}
你试着注释一下每一个方法。就可以看出来了 。Test3.add((short)3, 4)优先匹配第四种方法。如果没有第四种方法,它会匹配比它级别高的方法,如第一个或其他。Test3.add((short)3, 5.0f)属于add(int ,float),但第一种和第二种方法均适用,系统不明确对add的引用,所以无法通过编译。总之是一个优先级别的概念。






























作者: tanlei200620    时间: 2012-2-23 16:04
张红的实验方法 很棒,学习了
作者: 泮和顺    时间: 2012-2-23 20:11
张红 发表于 2012-2-23 14:18
你看错误提示
The method add(int, float) is ambiguous for the type
ambiguous 是有歧义的意思

你说是优先级的问题 那如果就一个你说可行 对吗
作者: 张红    时间: 2012-2-24 16:08
泮和顺 发表于 2012-2-23 20:11
你说是优先级的问题 那如果就一个你说可行 对吗

Test3.add((short)3, 4);调用以下函数顺序如下
add(int a, int b)
add(int a, float b)  add(float a, int b)//只能存在一种
add(float a, float b)


Test3.add((short)3, 5.0f);调用以下函数顺序如下
add(int a, float b)
add(float a, float b)

作者: 泮和顺    时间: 2012-2-24 18:30
很明显函数调用看参数类型来调用的,包括类型和顺序,没有优先不优先的 个人见解!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2