提问人:Phani 提问时间:3/8/2011 最后编辑:2240Phani 更新时间:10/6/2022 访问量:99547
如何对空参数进行方法重载?
How to do method overloading for null argument?
问:
我添加了三个带参数的方法:
public static void doSomething(Object obj) {
System.out.println("Object called");
}
public static void doSomething(char[] obj) {
System.out.println("Array called");
}
public static void doSomething(Integer obj) {
System.out.println("Integer called");
}
当我调用时,编译器会将错误抛出为模棱两可的方法。那么问题就是因为和方法还是方法?doSomething(null)
Integer
char[]
Integer
Object
答:
null
是这三种类型中的任何一种的有效值;因此,编译器无法决定使用哪个函数。改用类似 or 的东西。doSomething((Object)null)
doSomething((Integer)null)
评论
当使用参数调用时,这三种方法中的每一对本身都是模棱两可的。因为每个参数类型都是引用类型。null
以下是使用 null 调用您的一个特定方法的三种方法。
doSomething( (Object) null);
doSomething( (Integer) null);
doSomething( (char[]) null);
如果您真的打算使用参数调用这些方法,我是否可以建议删除这种歧义。这样的设计会在将来招致错误。null
评论
Integer
char[]
null
Integer - char[]
doSomething(null)
public static void doSomething(String str) { System.out.println("String called"); }
Java 中的每个类都扩展了 Object 类。甚至 Integer 类也扩展了 Object。因此,Object 和 Integer 都被视为 Object 实例。因此,当您将 null 作为参数传递时,编译器会混淆要调用哪个对象方法,即使用参数 Object 或参数 Integer,因为它们都是对象并且它们的引用可以为 null。但是 java 中的原语并没有扩展 Object。
Java 将始终尝试使用可用的方法的最具体适用版本(参见 JLS §15.12.2)。
Object
,并且都可以作为有效值。因此,所有 3 个版本都适用,因此 Java 必须找到最具体的版本。char[]
Integer
null
由于是 的超类型,数组版本比 -version 更具体。因此,如果仅存在这两种方法,则将选择版本。Object
char[]
Object
char[]
当 和 版本都可用时,它们都比另一个版本更具体,但没有一个版本比另一个版本更具体,因此 Java 无法决定调用哪一个。在这种情况下,您必须通过将参数转换为适当的类型来明确提及要调用的参数。char[]
Integer
Object
请注意,在实践中,这个问题的发生比人们想象的要少得多。这样做的原因是,仅当您显式调用带有或带有相当非特定类型的变量(例如)的方法时,才会发生这种情况。null
Object
相反,以下调用是完全明确的:
char[] x = null;
doSomething(x);
尽管您仍在传递值,但Java确切地知道要调用哪个方法,因为它将考虑变量的类型。null
评论
I Have tried this and when there is exactly one pair of overloaded method and one of them has a parameter type Object then the compiler will always select the method with more specific type. But when there is more than one specific type, then the compiler throws an ambiguous method error.
Since this is a compile time event, this can only happen when one intentionally passes null to this method. If this is done intentionally then it is better to overload this method again with no parameter or create another method altogether.
there is an ambiguity because of and .doSomething(char[] obj)
doSomething(Integer obj)
char[] and Integer both are the same superior for null that's why they are ambiguous.
class Sample{
public static void main (String[] args) {
Sample s = new Sample();
s.printVal(null);
}
public static void printVal(Object i){
System.out.println("obj called "+i);
}
public static void printVal(Integer i){
System.out.println("Int called "+i);
}
}
The output is Int called null and so ambiguity is with char[] and Integer
评论
public static void printVal(Object i){ System.out.println("obj called "+i); }
评论
Integer
int
reference to doSomething is ambiguous