重载继承类型的参数

时间:2012-05-10 10:56:49

标签: java inheritance overloading

好吧所以我只是想确认一下。

我正在为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重载?

4 个答案:

答案 0 :(得分:4)

这是一种非常危险的模式,实际上是在Effective Java中明确建议的。问题是方法签名解析在编译时是静态发生的,因此它不依赖于运行时的实际参数类型,只取决于它们声明的类型。

答案 1 :(得分:3)

Java将选择最具体的匹配,在您的情况下,将使用自动装箱布尔值< - >自动转换布尔值。布尔。如果您使用任何其他类型的字符串,则将使用Object变体。

您在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

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

答案 2 :(得分:2)

这取决于您传递给此方法的类型的引用。 E.g。

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

在其参数列表中使用Boolean调用该方法。它将选择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);
    }

}

这会打印 bar 。奇怪但真实:)

答案 3 :(得分:0)

发布以下示例:

if (displayed.indexOf(ry) !== -1){
    displayed.push(ry);
    document.write('<a href='+'"'+imagelinks[ry]+'"'+'><img src="'+myimages[ry]+'" border=0></a>');
} else {
    random_imglink();
}

和输出

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