6

クラスがあります

class Configuration {
  // various stuff

  @Override
  public String toString() {
    // assemble outString
    return outString;
  }
}

他にもクラスがあります

class Log {
  public static void d(String format, Object... d) {
    // print the format using d
  }
}

Log クラスは問題なく動作します。私はいつもそれを使用しています。今私がこれを行うとき:

Configuration config = getConfiguration();
Log.d(config);

コンパイラ エラーが発生しますThe method d(String, Object...) in the type Log is not applicable for the arguments (Configuration)。私はこれを解決できます:

Log.d("" + config);       // solution 1
Log.d(config.toString()); // solution 2

私の問題:これはどう違うのですか?最初の解決策では、コンパイラは 2 つの文字列を連結する必要があることに気付きますが、2 つ目の解決策は構成です。そうConfiguration#toString()呼ばれ、すべてが順調です。コンパイラ エラーの場合、コンパイラは文字列が必要であることを認識しますが、構成が指定されています。基本的に同じ問題です。

  • 必要: 文字列
  • 与えられた: 構成

これらのケースはどのように異なり、なぜtoString呼び出されないのですか?

4

6 に答える 6

11

言語を設計しているときに、プログラマーが + 演算子を使用して任意のオブジェクトを文字列に追加する場合、必ず が必要であると誰かが判断したStringため、暗黙的に呼び出すことtoString()は理にかなっています。

しかし、何か他のものを使用する任意のメソッドを呼び出した場合String、それは単に型エラーであり、まさにその静的型付けが防止するはずのものです。

于 2012-07-30T08:31:42.187 に答える
2

の一般的な使用法の1つは、次のようにtoString()print()println()メソッドですPrintStream

System.out.print(object);
System.out.println(object);

基本的に、これら2つのメソッドはtoString()渡されたオブジェクトを呼び出します。これは、ポリモーフィズムの利点の1つです。

于 2012-07-30T08:36:16.283 に答える
2

いい質問...

ただし、コンパイラは、正式なパラメータに一致するメソッドを呼び出しません。可能であれば、単にオブジェクトをキャストしようとします。

ただし、「+」演算子を使用すると、コンパイラはデフォルトで引数のtoString()メソッド(オブジェクトの場合)を実行します。

于 2012-07-30T08:37:19.953 に答える
1

You are passing Configuration class object argument in case 1 but in the case 2 , you are passing string argument . so no error occures

于 2012-07-30T08:41:35.517 に答える