visible true

技術的なメモを書く

GroovyでArrayAdapter(Context, int, int)がコンパイルエラーになる

問題

あんまり出会わないケースな気がしますが、こんな感じでGroovyで@CompileStaticにした上で、ArrayAdapter(Context, int, int)コンストラクタを呼んでいると、

@CompileStatic
public class HogeActivity extends ActionBarActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_hoge)
        
    def adapter = new ArrayAdapter<String>(
          this,
          android.R.layout.simple_list_item_1,
          android.R.id.text1);

        //...
  }
}

コンパイル時に怒られます。ArrayAdapter(Context, int, String[])を呼ぼうとしてるが腐ってるよ。的な。

 [Static type checking] - Cannot call android.widget.ArrayAdapter <String>#<init>(android.content.Context, int, java.lang.String[]) with arguments [hoge.HogeActivity, int, int] 

対応

色々こねくりまわした感じ以下の様に第一引数をContextにキャストすると行けました。

ArrayAdapter<String> adapter = new ArrayAdapter<String>(
  this as Context,
  android.R.layout.simple_list_item_1,
  android.R.id.text1);

こんな所でキャストかーと。気づかないよこんなの。

コンパイルは通るけどうまくいかないケース

ArrayAdapterのコンストラクタはいっぱいあるので、無理やり合わせにいく事はできます。

ArrayAdapter<String> adapter = new ArrayAdapter<String>(
  this as Context,
  android.R.layout.simple_list_item_1,
  android.R.id.text1,
  new String[0]
);

でもこの場合、第四引数のString配列はコンストラクタ内部でArrays.asList()によってimmutableなjava.util.Arrays$ArrayListに変換されて使われるので、adapter.add()した時に死にます。

まとめ

なんか困った時はasでキャストしてみる