2

では、toString が常に呼び出されないのはなぜでしょうか? これは Android API を使用した例です。

例えば

@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
        int position, long id) {
    Toast.makeText(this, adapterView, Toast.LENGTH_LONG).show();
}

コンパイルされません。ただし、次のように変更すると

@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
            int position, long id) {
    Toast.makeText(this, adapterView.toString(), Toast.LENGTH_LONG).show();
}

そうなる。実際の違いは何ですか?

4

7 に答える 7

8

adapterViewではありませんString

toString()キャストを実行するためにコンパイラによって自動的に呼び出されることはありません。これは型の安全性を少し損なうことになります。+""たとえば、コンパイラは toString() を自動的に呼び出します。

于 2011-01-16T13:40:21.060 に答える
6

コンパイラによって toString() が挿入される唯一の状況は、文字列の連結です。

于 2011-01-16T13:39:25.777 に答える
5

いつも とはどういう意味ですか? オブジェクトtoString()の表現を返す単なるメソッドです。StringはパラメーターをToast.makeText期待しますが、最初のケースでは、クラスStringのオブジェクトを指定します。AdapterViewしたがって、コンパイルされません:)

于 2011-01-16T13:38:28.993 に答える
1

また、これ

@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
            int position, long id) {
    Toast.makeText(this, "" + adapterView, Toast.LENGTH_LONG).show();
}

コンパイルします;)

于 2011-01-16T13:43:22.883 に答える
0

Android API はわかりませんが、AdapterView は実際には CharSequence のサブクラスではないため、toString() を適用する必要があります。

于 2011-01-16T13:40:30.023 に答える
0

Toast.makeTest の 2 番目のパラメーターは String 型だと思います。その後、タイプ AdapterView のパラメーターを渡そうとしても機能しません。toString() は、文字列を連結する場合を除いて、自動的に呼び出されることはありません (""+adapterView も機能しますが、より醜いです)。

于 2011-01-16T13:41:04.833 に答える
0

コンパイラは、メソッドの名前と、指定された各引数の数と型から、必要なメソッドを決定します。最初の例では、AdapterView を 2 番目のパラメーターとして持つ makeText というメソッドを探しますが、何も見つかりません (コンパイル エラーでそのことがわかります。2 番目の例では、2 番目のパラメーターは String であり、コンパイラは一致するものを見つけますメソッド. コンパイラは最初にメソッドを見つけることができず、次にパラメーターを適合させることができないことに注意してください。

于 2011-01-16T13:42:28.260 に答える