どのようfindViewByIdこのバージョンの()に動作しますか?

エレン・スパータス:

このバージョン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への参照ではなく、単に任意の整数値です。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=204677&siteId=1