2012-03-01 79 views
8

私はちょうどコンパイラからのこの興味深いメッセージに出くわしました、なぜ私はそれが起こっているのか分かりません。ここで場合ボタンへのキャストは冗長です - なぜですか?

例最初の例で

Button test = (Button) findViewById(R.id.someButtonId); 
test.setOnClickListener(this); 

例2

findViewById(R.id.someButtonId).setOnClickListener(this); 

あり、Iは、ButtonfindViewByIdによって返されたオブジェクトをキャストする必要があります。 2番目の例では、別のButtonクラスオブジェクトを使用しなかったため、返されたオブジェクトをキャストする必要はありません。私は

((Button)findViewById(R.id.someButtonId)).setOnClickListener(this); 

を経由して、それをキャストしようとすると私は警告Casting findViewById(R.id.someButtonId) to Button is redundantを取得します。

どうしてですか?キャスト警告を取り除こうとしていません。私はにこのの背後にある論理を知りたいのですが、findViewByIdによって返されたオブジェクトで別のオブジェクトを初期化しようとしないと、キャストは必要ありません。

+0

http://stackoverflow.com/questions/3502690/remove-redundant-casts-in-java –

+0

@Samir私はそれを削除する方法を知っています:)。私はそれを必要としません。私は**鋳造が必要でない理由を尋ねています**。 – sandalone

+0

:(警告が表示されない – Triode

答えて

6

findViewByIdViewを返し、このクラスで既に方法setOnClickListenerが定義されているためです。これは、キャストを実行しなくても、リスナを設定できることを意味します。あなたのキャストは冗長です。

+0

ここにもお尋ねしてください:examp2のように使っても安全ですか? – sandalone

+1

例2として完璧です。 –

+0

なぜそれは安全ではないと思いますか? –

2

findViewById()は常に、このようなImageViewの、ボタンなど、すべてのビューの親であるビューを返します...

setOnClickListenerは、Viewクラスのメソッドです。ボタンにキャストせずにクリックイベントを捕捉することができます。私はそれが冗長だと言うだけだと思う​​。

0

私はsetOnClickListener()がボタンではなくビュー内のメソッドであると推測しています。したがって、キャストは冗長です。

2

これは、例1では、Button変数に割り当てるため、明示的にButtonを検索する必要があるためです。

OnClickListenerは任意のタイプのView用であるため、Viewの特定のサブクラスにキャストしてOnClickListenerを設定する必要はありません。

+0

例2のように使用しても安全ですか? ? – sandalone

+1

絶対に。例2にあるViewがあれば、OnClickListenerを設定することができます。 –

+1

あなたは他のビューのid someButtonIdを使用しないので、あなたは確かにボタンだとわかるでしょうか? –

1

Viewで定義されているsetOnClickListenerを呼び出すために、をButtonにキャストする必要がないため、この問題が発生しています。これで十分ですfindViewById(R.id.someButtonId).setOnClickListener(this);

関連する問題