2011-01-16 18 views
2

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

例えば

@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(); 
} 

になります。実際の違いは何ですか?

答えて

5

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

+0

ありがとうございます。私は通常System.errを使って自分のコードをデバッグし、単なる文字列以上のものを扱うことができないことを忘れてしまいました。 :) – whirlwin

6

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

8

adapterViewは、Stringではありません。

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

0

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

0

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

0

コンパイラは、メソッドの名前、提供された各引数の数と型からどのメソッドが必要かを決定します。あなたの最初の例では、AdapterViewを2番目のパラメータとして持つmakeTextというメソッドを探して、何も見つからない(2番目の例では2番目のパラメータは文字列であり、コンパイラは一致。コンパイラは、我々はメソッドをオーバーロードしていませんでした他に、パラメータを適合させる、その後、最初の方法を見つけることができないという方法 注意

1

また、この

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

がコンパイルされます;)

関連する問題