2012-05-10 37 views
1

好吧,我只想确认一些东西。重载继承类型的参数

我正在为java的Properties类创建一个包装类,并且我提出了一个小问题。

,如果我有

public static void set(String key, Object value) { _p.set(key, value.toString()); } 

public static void set(String key, SomeClass value) { _p.set(key, value.SomeMethod().toString()); } 

Object超载称为只有当没有其他重载足够?

+2

'boolean'不从'Object'导出,因为它是一个[原始](HTTP ://docs.oracle。com/javase/tutorial/java/nutsandbolts/datatypes.html) – amit

+0

我知道原语是什么。可以像布尔一样容易。 – Qix

回答

3

Java将选择最具体的匹配项,在你的情况下,一个布尔值将被自动转换为自动装箱布尔型< - > Boolean。如果你使用任何其他类型的字符串,将使用对象变体。

的详细信息您在Java Language Specification 见8.4.9响应超载

新增找到评论:

class A { 
    public void print(Object o) { 
     System.out.println("A.print " + o); 
    } 

    public static void main(String[] args) { 
     B b = new B(); 
     A a = new A(); 
     b.print("test b"); 
     a.print("test a"); 
     ((A) b).print("test a or b"); 
    } 
} 

class B extends A { 
    public void print(Object o) { 
     System.out.println("B.print " + o); 
    } 
} 

打印:

您可以轻松地像一些代码测试的行为:

B.print test b 
A.print test a 
B.print test a or b 

我希望现在更清楚会发生什么。

+1

Java将选择*最具体*匹配。 – EJP

+0

好的,所以使用最新的适用衍生物。谢谢! – Qix

+0

@EJP谢谢我改变了 – stacker

4

这是一个非常危险的模式,实际上建议不要在Effective Java中显式使用。问题在于方法签名解析在编译时会静态地发生,所以它不依赖于运行时的实际参数类型,而只依赖于它们的声明类型。

+0

我想的很多。在我问这个问题之前,我已经把它改成了特定的类型(没有'Object'类型),但问题依然存在。 – Qix

2

它取决于您传递给此方法的参考文献的类型。例如。

Objeyt myObject = Boolean.TRUE; 
YourClass.set("foo", myObject); 

援引其参数列表与布尔的方法。它会选择Object版本。

参见例如在您的jdk中构造java.util.TreeSet(Collection c)的构造函数。类似的东西也在那里进行(它检查集合是否实际上是SortedSet,但SortedSet的构造函数)。

尝试

public class A { 

    public void method(String str) { 
     System.out.println("foo"); 
    } 

    public void method(Object obj) { 
     System.out.println("bar"); 
    } 

    public static void main(String[] args) { 
     A a = new A(); 
     Object obj = "A String"; 
     a.method(obj); 
    } 

} 

这将打印酒吧。奇怪,但真正:)

+0

+1为参考类型。 – Qix

0

过帐下面的例子:

public class Inherit { 
    public static void main(String[] args) { 
    System.out.println("Hello, Inheritance!"); 

    Parent parent = new Parent(); 
    Parent childp = new Child(); 
    Child childc = new Child(); 

    System.out.println("==============================="); 
    parent.print(parent); 
    parent.print(childp); 
    parent.print(childc); 

    System.out.println("==============================="); 
    childp.print(parent); 
    childp.print(childp); 
    childp.print(childc); 

    System.out.println("==============================="); 
    childc.print(parent); 
    childc.print(childp); 
    childc.print(childc); 

    } 

} 

class Parent { 
    public void print(Parent x) { 
     System.out.println("Parent.print(Parent)"); 
    } 
} 

class Child extends Parent { 

    public void print(Child x) { 
     System.out.println("Child.print(Child)"); 
    } 

    @Override 
    public void print(Parent x) { 
     System.out.println("Child.print(Parent)"); 
    } 
} 

和输出

Hello, Inheritance! 
=============================== 
Parent.print(Parent) 
Parent.print(Parent) 
Parent.print(Parent) 
=============================== 
Child.print(Parent) 
Child.print(Parent) 
Child.print(Parent) 
=============================== 
Child.print(Parent) 
Child.print(Parent) 
Child.print(Child)