Javaの言語仕様はやっぱり微妙すぎる
Genericsにてnew T()できないのがキモイ
のタイトルの問題に対して、Javaでは以下の様にすることで解決するらしい。
static <T> T method(Class<T> c) { T instance = c.newInstance(); return instance; }
これは後方互換のため。
うん、それは良いんだけどさ……
継承後のクラス型を戻り値の型として指定可能な方法が見つからないのがつらい。
たとえば以下。(これだと全然足りないけれども)
class MySuperClass { <T extends MySuperClass> T method() { return this; } }
これ、Javaではthisの引数を省略する記法しかないんだけど、
thisの非省略を書ける様にするなら、以下の2通りが書ける様になるわけだ。
class MySuperClass { MySuperClass method(MySuperClass this) { return this; } }
↑は従来のthisを表す提案する記法、↓は従来では書けなかったthisを表す提案する記法
class MySuperClass { <T extends MySuperClass> T method(T this) { return this; } }
thisは普通、省略して当然という感覚で来たけれども、ジェネリクスにおいて型を特定する際には有効なはず。
であるならば、thisの非省略ができても良いんじゃないかなと、ちょっと思った。
コンパイラにちょっと手を加えてあげれば、バイナリ時、ちゃんと後方互換できる形にはなるはず。
てか、pythonなんかだと、普通にthis(self)は省略せずに書くし、
staticメソッド時の呼び出しクラスも、clsとして引数として書けるし。
なんていうか、Javaは色々と時代に取り残されまくってる感じがする。
でも、もろもろの事情で今後もJavaとは付き合っていかなあかんわけですね。
Javaで、継承後のクラスの型の戻り値を指定可能な方法を知ってる方が居ましたら、ぜひ教えて頂きたい限りです。
追記(同日中):
とりあえず以下のようにすれば良いのかな。
class MySuperClass<MySubClass extends MySuperClass> { MySubClass method() { return (MySubClass)this; } }
継承クラスを作るときは一手間になるけど、継承クラスを使う時は少し便利になりそうかなぁと。