空参数的java方法重载

yiytaume  于 2021-07-03  发布在  Java
关注(0)|答案(7)|浏览(365)

我添加了三个带参数的方法:

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 方法?

xqkwcwgp

xqkwcwgp1#

我试过这个方法,当有一对重载方法,其中一个有一个参数类型对象时,编译器总是选择更具体类型的方法。但是当有多个特定类型时,编译器抛出一个不明确的方法错误。
因为这是一个编译时事件,所以只有当有人故意将null传递给这个方法时,才会发生这种情况。如果有意这样做,那么最好不带参数再次重载此方法,或者创建另一个方法。

mitkmikd

mitkmikd2#

当使用 null 争论。因为每个参数类型都是引用类型。
下面是用null调用一个特定方法的三种方法。

doSomething( (Object) null);
doSomething( (Integer) null);
doSomething( (char[]) null);

如果你真的打算用 null 论据。这样的设计将来会出错。

vmdwslir

vmdwslir3#

java中的每个类都扩展对象类,甚至整数类也扩展对象类。因此,对象和整数都被视为对象示例。因此,当您将null作为参数传递时,编译器会混淆要调用哪个对象方法,即使用parameter object或parameter integer,因为它们都是对象,并且它们的引用可以为null。但是java中的原语并不扩展object。

omtl5h9j

omtl5h9j4#

null 是三种类型中任何一种的有效值;因此编译器无法决定使用哪个函数。使用类似 doSomething((Object)null) 或者 doSomething((Integer)null) 相反。

9nvpjoqh

9nvpjoqh5#

由于dosomething(char[]obj)和dosomething(integer obj),存在歧义。
char[]和integer对于null都是相同的优势,这就是为什么它们是不明确的。

eanckbw9

eanckbw96#

java总是尝试使用可用方法的最具体的适用版本(参见jls)§15.12.2). Object , char[] 以及 Integer 都能接受吗 null 作为有效值。因此这3个版本都是适用的,所以java必须找到最具体的版本。
Object 是超级类型的 char[] ,数组版本比 Object -版本。因此,如果只有这两种方法存在,那么 char[] 将选择版本。
当两个 char[] 以及 Integer 如果有可用的版本,那么这两个版本都比 Object 但是没有一个比另一个更具体,所以java无法决定调用哪一个。在这种情况下,您必须通过将参数强制转换为适当的类型来显式地提到要调用哪个参数。
请注意,在实践中,这个问题的发生比人们想象的要少得多。这样做的原因是,只有在使用显式调用方法时才会发生这种情况 null 或者使用非特定类型的变量(例如 Object ).
相反,以下调用将是完全明确的:

char[] x = null;
doSomething(x);

尽管你还在传递值 null ,java确切地知道要调用哪个方法,因为它会考虑变量的类型。

ggazkfy8

ggazkfy87#

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);
    }
}

输出为int,称为null,因此使用char[]和integer表示歧义

相关问题