好吧所以我只是想确认一下。
我正在为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
重载?
答案 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)");
}
}