問題
あんまり出会わないケースな気がしますが、こんな感じで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
でキャストしてみる