java编程思想P103页关于可变参数的编译错误

时间:2022-08-27 23:12:37
public class Test {
     static void  f(float f1,Character ... args)
     {
          System.out.println("first");
     }
     static void  f(Character ... args)
     {
          System.out.println("second");
     }
     public static void main(String[] args) 
     {
         f(1,'a');
         f('a','b'); //这里报错:The method f(float, Character[]) is ambiguous for the type Test
         //为什么会出错?请详解,谢谢!我个人觉得,可能跟JAVA的自动装箱机制有关,但搞不明白。
     }
}
可参考JAVA编程思想,P105

12 个解决方案

#1


你一个字符怎么可能转成单精度浮点数!
但是问题不是这个,为什么编译器会匹配到第一个f,不是应该调用可变参数的那个方法吗??

#2


引用 1 楼 alan19931103 的回复:
你一个字符怎么可能转成单精度浮点数!
但是问题不是这个,为什么编译器会匹配到第一个f,不是应该调用可变参数的那个方法吗??

好吧我错了,还真的可以转成浮点。

我编译了,报错和你一样。那么理由就很明确了
编译器不知道你调用的是哪个f方法,因为java中,通过参数不同来匹配不同的同名方法,但是你调用的时候传入的参数可以同时匹配两个方法,所以出错了。
因为char-->float是可行的,所以能够匹配第一个f,同时两个char参数也能够匹配可变参数的f方法,编译器此刻懵逼了

#3


诶,有必要再看一边thinking in java了

#4


http://m.oschina.net/blog/223229
楼主看看这个~~~~

#5


引用 2 楼 alan19931103 的回复:
Quote: 引用 1 楼 alan19931103 的回复:

你一个字符怎么可能转成单精度浮点数!
但是问题不是这个,为什么编译器会匹配到第一个f,不是应该调用可变参数的那个方法吗??

好吧我错了,还真的可以转成浮点。

我编译了,报错和你一样。那么理由就很明确了
编译器不知道你调用的是哪个f方法,因为java中,通过参数不同来匹配不同的同名方法,但是你调用的时候传入的参数可以同时匹配两个方法,所以出错了。
因为char-->float是可行的,所以能够匹配第一个f,同时两个char参数也能够匹配可变参数的f方法,编译器此刻懵逼了


问题主要出在第二个f()的调用,但是这不是属于重载方法吗,为什么我把第二个f()改成static void f(char c,Character ... args)就可以了,而若改成static void f(Character c,Character ... args)就还是出错

#6


引用 4 楼 sinat_23317197 的回复:
http://m.oschina.net/blog/223229
楼主看看这个~~~~


还是不太明白,按照这篇文章我觉得它应该去匹配第一个f()

#7


是重载,但是不要随便乱重载,你传的参数让编译器不知道调用哪个f。书上说的很清楚的啊。问题出在你传的参数类型上。

#8


编译器匹配重载时,发现两个都能匹配上,当时就懵逼了,不知道你到底想调用的是哪个,就会报错

#9


我懂了,这个问题的根本原因在于两个方法其实都不能很好地匹配f('a','b'),说白了其实两个重载的方法都不是第一选择,但是偏偏这两个方法又都能匹配,所以编译器不知道到底要匹配哪一个

#10


引用 9 楼 macjian 的回复:
我懂了,这个问题的根本原因在于两个方法其实都不能很好地匹配f('a','b'),说白了其实两个重载的方法都不是第一选择,但是偏偏这两个方法又都能匹配,所以编译器不知道到底要匹配哪一个

 可以看一看这篇文章

#11


引用 10 楼 macjian 的回复:
Quote: 引用 9 楼 macjian 的回复:

我懂了,这个问题的根本原因在于两个方法其实都不能很好地匹配f('a','b'),说白了其实两个重载的方法都不是第一选择,但是偏偏这两个方法又都能匹配,所以编译器不知道到底要匹配哪一个

 可以看一看这篇文章 http://www.myexception.cn/software/1873382.html

#12


Character是一个类,‘a'是一个基本类型字符char(C语言里面那个char)当然不能重载了。

java.lang.Integer是一个类.对它的操作要通过类的方法   
  int是JAVA缺省的8中基本数据类型之一.不是类的对象.
int是基本数据类型,Integer是对int进行了封装的一个类。   
  声明为int的变量不需要实例化,声明为Interger的变量需要实例化   
int是基本类型,Integer是包装类,也就是类。
Integer   是比int   更高级的   数据类型   为什么java中使用int   而不像vb中那样使用Integer
int是面向机器底层的数值类型,是Primitive类型的数据类型,而Integer是int的Warpper类,是面向对象的即OOP的对象类型。int   一般只用在数值计算中,而Integer是用在Java的其它要使用对象的地方,比如Map的Key与Value,List与Set的Element若要保存数值信息都要把int包装成Integer对象使用。
Java   提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。   
  原始类型           封装类   
  boolean             Boolean   
  char                   Character   
  byte                   Byte   
  short                 Short   
  int                     Integer   
  long                   Long   
  float                 Float   
  double               Double   
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为   null,而原始类型实例变量的缺省值与它们的类型有关。
  int   一般做为数值参数就够了   
  integer   一般做类型转换的时候用的较

#1


你一个字符怎么可能转成单精度浮点数!
但是问题不是这个,为什么编译器会匹配到第一个f,不是应该调用可变参数的那个方法吗??

#2


引用 1 楼 alan19931103 的回复:
你一个字符怎么可能转成单精度浮点数!
但是问题不是这个,为什么编译器会匹配到第一个f,不是应该调用可变参数的那个方法吗??

好吧我错了,还真的可以转成浮点。

我编译了,报错和你一样。那么理由就很明确了
编译器不知道你调用的是哪个f方法,因为java中,通过参数不同来匹配不同的同名方法,但是你调用的时候传入的参数可以同时匹配两个方法,所以出错了。
因为char-->float是可行的,所以能够匹配第一个f,同时两个char参数也能够匹配可变参数的f方法,编译器此刻懵逼了

#3


诶,有必要再看一边thinking in java了

#4


http://m.oschina.net/blog/223229
楼主看看这个~~~~

#5


引用 2 楼 alan19931103 的回复:
Quote: 引用 1 楼 alan19931103 的回复:

你一个字符怎么可能转成单精度浮点数!
但是问题不是这个,为什么编译器会匹配到第一个f,不是应该调用可变参数的那个方法吗??

好吧我错了,还真的可以转成浮点。

我编译了,报错和你一样。那么理由就很明确了
编译器不知道你调用的是哪个f方法,因为java中,通过参数不同来匹配不同的同名方法,但是你调用的时候传入的参数可以同时匹配两个方法,所以出错了。
因为char-->float是可行的,所以能够匹配第一个f,同时两个char参数也能够匹配可变参数的f方法,编译器此刻懵逼了


问题主要出在第二个f()的调用,但是这不是属于重载方法吗,为什么我把第二个f()改成static void f(char c,Character ... args)就可以了,而若改成static void f(Character c,Character ... args)就还是出错

#6


引用 4 楼 sinat_23317197 的回复:
http://m.oschina.net/blog/223229
楼主看看这个~~~~


还是不太明白,按照这篇文章我觉得它应该去匹配第一个f()

#7


是重载,但是不要随便乱重载,你传的参数让编译器不知道调用哪个f。书上说的很清楚的啊。问题出在你传的参数类型上。

#8


编译器匹配重载时,发现两个都能匹配上,当时就懵逼了,不知道你到底想调用的是哪个,就会报错

#9


我懂了,这个问题的根本原因在于两个方法其实都不能很好地匹配f('a','b'),说白了其实两个重载的方法都不是第一选择,但是偏偏这两个方法又都能匹配,所以编译器不知道到底要匹配哪一个

#10


引用 9 楼 macjian 的回复:
我懂了,这个问题的根本原因在于两个方法其实都不能很好地匹配f('a','b'),说白了其实两个重载的方法都不是第一选择,但是偏偏这两个方法又都能匹配,所以编译器不知道到底要匹配哪一个

 可以看一看这篇文章

#11


引用 10 楼 macjian 的回复:
Quote: 引用 9 楼 macjian 的回复:

我懂了,这个问题的根本原因在于两个方法其实都不能很好地匹配f('a','b'),说白了其实两个重载的方法都不是第一选择,但是偏偏这两个方法又都能匹配,所以编译器不知道到底要匹配哪一个

 可以看一看这篇文章 http://www.myexception.cn/software/1873382.html

#12


Character是一个类,‘a'是一个基本类型字符char(C语言里面那个char)当然不能重载了。

java.lang.Integer是一个类.对它的操作要通过类的方法   
  int是JAVA缺省的8中基本数据类型之一.不是类的对象.
int是基本数据类型,Integer是对int进行了封装的一个类。   
  声明为int的变量不需要实例化,声明为Interger的变量需要实例化   
int是基本类型,Integer是包装类,也就是类。
Integer   是比int   更高级的   数据类型   为什么java中使用int   而不像vb中那样使用Integer
int是面向机器底层的数值类型,是Primitive类型的数据类型,而Integer是int的Warpper类,是面向对象的即OOP的对象类型。int   一般只用在数值计算中,而Integer是用在Java的其它要使用对象的地方,比如Map的Key与Value,List与Set的Element若要保存数值信息都要把int包装成Integer对象使用。
Java   提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。   
  原始类型           封装类   
  boolean             Boolean   
  char                   Character   
  byte                   Byte   
  short                 Short   
  int                     Integer   
  long                   Long   
  float                 Float   
  double               Double   
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为   null,而原始类型实例变量的缺省值与它们的类型有关。
  int   一般做为数值参数就够了   
  integer   一般做类型转换的时候用的较