Javaのジェネリクス
上記のエントリ、とても勉強になりました。
- 型変数には「境界」を設定できる(extendsやsuperを使って)
- 型変数のスコープは2つある(クラスのインスタンスと、メソッド)
AndroidのfindViewByIdをジェネリクってみる
AndroidのfindViewById(int)はキャストが必要です。
Button btnCalc = (Button) findViewById(R.id.button_calculate);
こいつにジェネリクスを使えばキャストが不要になりそうです。学んだことを踏まえて、下記のようなメソッドを定義してみました。(CommonActivityというクラスを作って定義)
@SuppressWarnings("unchecked") public <T extends View> T findView(int id) { return (T) findViewById(id); }
このメソッド経由でViewを取得したら、キャストが不要になりました。
Button btnCalc = findView(R.id.button_calculate);
ジェネリクスって便利ですね〜。(このメソッドが有用かどうかはわかりませんが)
ところでなんかこの動きに既視感があるな、と思ったらSlim3のController#requestScope()でした。
@SuppressWarnings("unchecked") protected <T> T requestScope(CharSequence name) throws NullPointerException { if (name == null) { throw new NullPointerException( "The name parameter must not be null."); } return (T) request.getAttribute(name.toString()); }