2

了解しました。確認したいだけです。

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

4 に答える 4

4

これは使用するのに非常に危険なパターンであり、EffectiveJavaでは明示的に使用しないことをお勧めします。問題は、メソッドシグネチャの解決がコンパイル時に静的に行われるため、実行時の引数の実際の型に依存せず、宣言された型のみに依存することです。

于 2012-05-10T11:09:33.047 に答える
3

Javaは最も具体的な一致を選択します。この場合、ブール値は自動ボクシングブール値<->ブール値を使用して自動的に変換されます。Stringのような他のタイプを使用する場合は、Objectバリアントが使用されます。

Java言語仕様に記載されている詳細については、 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

私は今、何が起こるかがより明確になることを願っています。

于 2012-05-10T11:01:33.180 に答える
2

これは、このメソッドに渡す参照のタイプによって異なります。例えば

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

パラメータリストにブール値を含むメソッドは呼び出されません。バージョンを選択しますObject

たとえば、java.util.TreeSet(Collection c)jdkののコンストラクタを参照してください。同様のことがそこでも行われています(コレクションが実際にであるかどうかをチェックします、のコンストラクター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);
    }

}

これはバーを印刷します。奇妙ですが本当です:)

于 2012-05-10T11:12:47.373 に答える
1

次の例を投稿します。

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)
于 2017-04-11T00:31:38.967 に答える