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