0

私は最近、いくつかのAndroidコードに取り組んでいました(これは、ジェネリックと型のJava自動解決に関する一般的なJavaの質問です-しゃれを許してください)。

これが私のコードです(Androidベースですが、必要に応じてJava固有のバージョンを作成してください)

class ViewFinder<T extends View> {

    @SuppressWarnings("unchecked")
    final static <T> T byId(View view, int resource) {

        return (T) view.findViewById(resource);


    }

}

ここに興味深いビットがあります...

// Convert XML UI component definitions into the static View Holder object

// Here is what we normally have to do for Android to convert the XML into a UI component
holder.txtGroupName = (TextView) row.findViewById(R.id.txtGroupName);

// This is what I can do with my ViewFinder class above!        
holder.txtGroupName = ViewFinder.byId(row, R.id.txtGroupName);

// This is what I was EXPECTING to do with my ViewFinder class above!       
holder.txtGroupName = ViewFinder<TextView>.byId(row, R.id.txtGroupName);

いいえ、Java (Android ではない) が Generic T 型を TextView UI コンポーネントに解決していることは知っていますが、なぜ、どのように* ?

ここで何が起こっているかの「実況」を入手できますか? 次回何かをコーディングする前に、これが起こるかどうかを把握できるようにしたい.

4

1 に答える 1

1

私の推測では、Java 7 を実行していると思います。http: //docs.oracle.com/javase/tutorial/java/generics/genTypeInference.htmlをご覧ください。

何が起こっているのか表面をなぞると: Java コンパイラーのタスクの一部は、

  • 解析 - 大まかな構文チェックと抽象構文ツリー AST の構築。
  • 除草 - AST をさらにチェックします。
  • TypeValidation - ここで魔法が起こると思います。この時点で AST が検証され、変数や式などのすべてのノードにマークが追加されます。TypeValidation プロセスはノードに型を追加し、それらが正しいことを確認します。Java 7 の型の推論では、このフェーズが拡張されて、割り当ての右側に型が自動的に追加されると想定しています (もちろん有効な場合)。次のフェーズに進むとき、 など List<String> str = new ArrayList<>()は に変換されList<String> str = new ArrayList<String>()ます。
  • ...
  • 最後に、bonusinfo として常に 0xCAFEBABE で始まる Java Bytcode が出力されます。

これが理にかなっていることを願っています

于 2013-09-26T07:03:37.193 に答える