にわかJava使いが答えてみる。

[Q1]次のコードの問題点を述べよ。その理由も述べよ。

ArrayList<String> list = new ArrayList<String>();
Javaの良い設問を募集 — ありえるえりあ

出題の意図としては、

List<String> list = new ArrayList<String>();

と書き直させたいのでしょうか?これは、JavaのListはaddして良いんだとわかるまで、しょっちゅうやってました*1。これがなんでダメなのかはいまいち理解できてなかったりします(プログラミングの習慣としては、それなりに身についてきてますけど)。

次のコードで何が問題かを答えよ

void f (List l) {
  for (int i=0; i<l.size(); ++i) {
    g(l.get(i));
  }
}
Java : 問題 - lethevert is a programmer

これは

void f (List<T> l) {
  for (T x : l) {
    g(x);
  }
}

かなぁ。Objectが要素なコレクションは使いたくないけど、wildcard周りを全然理解していないので、genericsgenericsで怖かったりします。大体直感的に使える、という程度の理解だから、いつかはまりそうだ。

よく考えてみたら、上のやつをArrayList=…と書きたくなる心理も、generics+subtypingを避けたいからじゃないだろうかと思った。

*1:MLとかの感覚だと、Listの操作はhdとtlだけですので