Generics
昨日の夜は,ずっとGenericsと格闘してました.
クラスAとクラスBが互いに依存関係があるときに,どうしてもGenericsでうまく表現できなくって,なんかいい方法がないかなあと考えてたわけです.やりたいことは,こんな感じです.
class A{ B get(){ ... } } class B{ A get(){ ... } } class A1 extends A{ B1 get(){ ... } } class B1 extends B{ A1 get(){ ... } } class A2 extends A{ B2 get(){ ... } } class B2 extends B{ A1 get(){ ... } }
いままでだと,get()が,戻り値の型しか違わないからコンパイルエラーになってしまう.で,うまくgenericsで表現してコンパイルエラーを防ぎたいと.で,こんなことを思いつく.
class A{ BT get(){ ... } } class B { AT get(){ ... } } class A1 extends A {} class B1 extends B {} class A2 extends A {} class B2 extends B {}
これだと何がダメかというと,たしかにA1,A2,B1,B2についてはうまく表現することができてるんだけど,AとBについてはうまく表現できてない.たとえば,真面目にgenericsでAとBの関係を表現しようとすると,
A>>> a = new A>>>();
になってしまう.途中で止めてもいいんだけど,
A> a = new A>(); B b = a.get(); A a1 = b.get();
これだと,ここまでで型チェックが終わってしまう.これ以降は,型安全性のワーニングが出てしまう.
AとBをabstractにするか,interfaceにするかでこの問題は解決するんだけど,genericsのためだけにクラス設計を変えるのはスマートじゃない気がするしなあ.
なんか良い解決方法はないかな.
追記
Genericsのチュートリアルを読んでたら,なんか,最初の例でもコンパイルできるみたい.昨日一晩の苦労はなんだったんだorz