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,不是应该调用可变参数的那个方法吗??
但是问题不是这个,为什么编译器会匹配到第一个f,不是应该调用可变参数的那个方法吗??
#2
好吧我错了,还真的可以转成浮点。
我编译了,报错和你一样。那么理由就很明确了
编译器不知道你调用的是哪个f方法,因为java中,通过参数不同来匹配不同的同名方法,但是你调用的时候传入的参数可以同时匹配两个方法,所以出错了。
因为char-->float是可行的,所以能够匹配第一个f,同时两个char参数也能够匹配可变参数的f方法,编译器此刻懵逼了
#3
诶,有必要再看一边thinking in java了
#4
http://m.oschina.net/blog/223229
楼主看看这个~~~~
楼主看看这个~~~~
#5
问题主要出在第二个f()的调用,但是这不是属于重载方法吗,为什么我把第二个f()改成static void f(char c,Character ... args)就可以了,而若改成static void f(Character c,Character ... args)就还是出错
#6
http://m.oschina.net/blog/223229
楼主看看这个~~~~
还是不太明白,按照这篇文章我觉得它应该去匹配第一个f()
#7
是重载,但是不要随便乱重载,你传的参数让编译器不知道调用哪个f。书上说的很清楚的啊。问题出在你传的参数类型上。
#8
编译器匹配重载时,发现两个都能匹配上,当时就懵逼了,不知道你到底想调用的是哪个,就会报错
#9
我懂了,这个问题的根本原因在于两个方法其实都不能很好地匹配f('a','b'),说白了其实两个重载的方法都不是第一选择,但是偏偏这两个方法又都能匹配,所以编译器不知道到底要匹配哪一个
#10
我懂了,这个问题的根本原因在于两个方法其实都不能很好地匹配f('a','b'),说白了其实两个重载的方法都不是第一选择,但是偏偏这两个方法又都能匹配,所以编译器不知道到底要匹配哪一个
可以看一看这篇文章
#11
我懂了,这个问题的根本原因在于两个方法其实都不能很好地匹配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 一般做类型转换的时候用的较
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,不是应该调用可变参数的那个方法吗??
但是问题不是这个,为什么编译器会匹配到第一个f,不是应该调用可变参数的那个方法吗??
#2
你一个字符怎么可能转成单精度浮点数!
但是问题不是这个,为什么编译器会匹配到第一个f,不是应该调用可变参数的那个方法吗??
好吧我错了,还真的可以转成浮点。
我编译了,报错和你一样。那么理由就很明确了
编译器不知道你调用的是哪个f方法,因为java中,通过参数不同来匹配不同的同名方法,但是你调用的时候传入的参数可以同时匹配两个方法,所以出错了。
因为char-->float是可行的,所以能够匹配第一个f,同时两个char参数也能够匹配可变参数的f方法,编译器此刻懵逼了
#3
诶,有必要再看一边thinking in java了
#4
http://m.oschina.net/blog/223229
楼主看看这个~~~~
楼主看看这个~~~~
#5
你一个字符怎么可能转成单精度浮点数!
但是问题不是这个,为什么编译器会匹配到第一个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
http://m.oschina.net/blog/223229
楼主看看这个~~~~
还是不太明白,按照这篇文章我觉得它应该去匹配第一个f()
#7
是重载,但是不要随便乱重载,你传的参数让编译器不知道调用哪个f。书上说的很清楚的啊。问题出在你传的参数类型上。
#8
编译器匹配重载时,发现两个都能匹配上,当时就懵逼了,不知道你到底想调用的是哪个,就会报错
#9
我懂了,这个问题的根本原因在于两个方法其实都不能很好地匹配f('a','b'),说白了其实两个重载的方法都不是第一选择,但是偏偏这两个方法又都能匹配,所以编译器不知道到底要匹配哪一个
#10
我懂了,这个问题的根本原因在于两个方法其实都不能很好地匹配f('a','b'),说白了其实两个重载的方法都不是第一选择,但是偏偏这两个方法又都能匹配,所以编译器不知道到底要匹配哪一个
可以看一看这篇文章
#11
我懂了,这个问题的根本原因在于两个方法其实都不能很好地匹配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 一般做类型转换的时候用的较
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 一般做类型转换的时候用的较