JavaのGenericメソッドで、匿名クラスを引数にする場合の型解決講座

4
Ktz @ktz_alias

えーJavaって、List<Hoge> list = Arrays.asList(new Hoge {{ ... }})できないのー?

2013-09-03 14:00:37
ぐるぐる系SQL @bleis

@ktz_alias List<? extends Hoge> list = ...とかでは?

2013-09-03 14:01:16
なぎせ ゆうき @nagise

@ktz_alias List<Hoge> list = Arrays.asList(new Hoge[]{ ... }); ですか?

2013-09-03 14:03:20
ぐるぐる系SQL @bleis

@nagise @ktz_alias new Hoge() {{ ... }}だと思いますよ。

2013-09-03 14:03:49
なぎせ ゆうき @nagise

@bleis @ktz_alias asListに渡すオブジェクトを無名クラスで拡張したいのか

2013-09-03 14:05:15
Ktz @ktz_alias

@bleis それでいけました。C# と同じノリで書くのは難しいものですね。

2013-09-03 14:05:41
ぐるぐる系SQL @bleis

@ktz_alias 共変反変がユーザコード側で指定できるの、結構便利っすよ。ただ、面倒感はある。

2013-09-03 14:06:55
なぎせ ゆうき @nagise

@bleis @ktz_alias だったら List<Hoge> list = Arrays.<Hoge>asList(new Hoge(){{ ... }}); ですかね。型推論が失敗してるだけなので

2013-09-03 14:07:17
Ktz @ktz_alias

@nagise @bleis フィールドpublicにしてて、初期化のために、hoge.aとか書くのたるいので、匿名クラスで代用しようとした結果です。

2013-09-03 14:08:16
Ktz @ktz_alias

@bleis 共変の指定がソースコードの中であふれかえるので、できればC#みたいにクラス内に閉じて欲しかったんですけどね...。ただでさえ常に変数の型名指定しなきゃならんわけで。

2013-09-03 14:12:04
なぎせ ゆうき @nagise

@ktz_alias @bleis List<Hoge> list = Arrays.<Hoge>asList(new Hoge(){{ ... }}); が正解。asList(T ...)の部分にHogeのサブクラス渡したので型推論が失敗してるだけ

2013-09-03 14:13:32
Ktz @ktz_alias

@nagise @bleis これはいけました。メソッドの前に解決したい型名指定すればよかったのですね。C# みたくメソッド名の後につけてできなかったので、明示指定できないものと思い込んでいました。

2013-09-03 14:16:42
Ktz @ktz_alias

やったーJavaのGenericレベルが1レベル上がった!

2013-09-03 14:18:06
なぎせ ゆうき @nagise

@ktz_alias @bleis メソッドスコープのジェネリクスに明示的に型をバインドする構文はあまり知られてないですからね。そしてメソッドスコープのときだけ型推論が効くので、問題点が分かりにくい感じですね。ジェネリクスのよいサンプルコードですね :-)

2013-09-03 14:18:25

一方Java8では・・・

きしだൠ(K1S) @kis

@ktz_alias @nagise @bleis ところでこれ、たぶんJava8ではちゃんと型推論してくれる気がしますね。

2013-09-03 22:06:08
まとめたひと
Ktz @ktz_alias

会社でdelphiのちC# おうちでphp(最近放置プレーぎみ) scalaは3歩進んで10歩下がる感じ F#かわいいよF# 音ゲーとシューティングとパズルゲーが好物(下手の横好き)