public class App {
public static void main(String[] args) {
ConTest conTest = new ConTest(null);
}
POJO:
public class ConTest {
private String a;
private Object b;
public ConTest(Object b) {
System.out.println("Object" + b);
}
public ConTest(String a) {
System.out.println("String :" + a);
}
}
当我运行这段代码时,它总是调用具有String
参数的构造函数。为什么呢?
答案 0 :(得分:5)
null
可以传递给两个构造函数。
但是,String
参数比Object
参数更具体(因为String
是Object
的子类),并且重载解析过程的方法更喜欢具有更具体的参数类型的方法(或您的情况下的构造函数)。
如评论中所述,如果您想强制调用接受Object
的构造函数,则可以将null
强制转换为Object
:
ConTest conTest = new ConTest((Object)null);
答案 1 :(得分:3)
原因是,有多个拟合方法(在这种情况下是构造函数)适合调用。如果方法调用有多个拟合方法,那么它总是采用最具体的方法。在这种情况下,String
比Object
更具体。
这可以在继承链中看到。 String
继承自Object
如果有两个同样具体的方法,那么编译器会告诉您错误消息The method method(parameter) is ambiguous for the type Class
。这可以在这个例子中看到。
public class A {
public static void main(String[] args) {
// compiler complains with:
// The method test(Object) is ambiguous for the type A
test(null);
}
static void test(Object o) {
System.out.println("IN OBJECT");
}
static void test(A a) {
System.out.println("IN A");
}
static void test(B b) {
System.out.println("IN B");
}
class B {
}
}
稍微改变一下,让B
继承A
后,方法test(B)
会变得更加具体,因为B
比A
更具体,并且编译器错误消息消失了。
public class A {
public static void main(String[] args) {
test(null);
}
static void test(Object o) {
System.out.println("IN OBJECT");
}
static void test(A a) {
System.out.println("IN A");
}
static void test(B b) {
System.out.println("IN B");
}
class B extends A{
}
}