エレン・スパータス:
このバージョンのView.findViewById()
リターンの最も具体的なコンクリートのサブタイプView
:
protected <T extends View> T findViewById(@IdRes int id) {
return (T) getRootView().findViewById(id);
}
それがどのように動作しますか?具体的には、どのタイプはコンパイル時に推測することができid
、実行時に見上げていますか?それは、アノテーションを行うことがありますか?
この程度で類似したタイトルの質問とは異なり、使用しますfindViewById()
:
私が知りたいのですが、なぜそれが動作します。
ロブPridham:
これは、推測することはできません。これは、キャストを使用しています- return (T)
。呼び出し側は、タイプTが配置されるビューのタイプと一致することを保証する責任があります。彼らはこの間違ったを取得した場合、操作はで失敗しますClassCastException
。
型が明示的に指定することができ、すなわち
this.<TextView>findViewById(R.id.someTextView)
(私はこの間違ったを持っている場合は、私の構文を言い訳 - 私はほとんど今Kotlinに扱います)
またはそれが先から推測することができます。
TextView foundView = findViewById(R.id.someTextView)
しかし、いずれの場合も、責任は呼び出し側です。
Androidのツールチェーンは、あなたのIDE内のコード、および農産物の警告や障害にクロスリファレンスレイアウトXMLに更なる作業を行うことができますが、これは、実行時に何のJava実行するの上にコンパイル時の層です。
これは、とは何の関係もありません@IdRes
再コンパイル時に- -アサートにあり、注釈を、というid
パラメータは、いくつかのXMLベースのエンティティのIDへの参照ではなく、単に任意の整数値です。