できるだけユーザーフレンドリーな API を作ろうとしています。
持ってみましょう:
class B extends A {}
class A {
A setX(){ ...; return this; }
}
今これ
B b = new B().setX();
は無効です。キャストする必要があります:
B b = (B) new B().setX();
ジェネリックを使用A
してコンパイラに「この」型を認識させ、最初の方法を受け入れる方法はありますか? (new B<B>().setX()
つまり、それは醜いです。)
この場合、Java で再入力が必要な理由はわかっています。setX()
A を返す理由を説明しないでください。
ジェネリックがこれを解決できるかどうか尋ねています。
そして、「これが静的型付けの仕組みです」「ジェネリックでさえそれを助けることはできない」とまだ言いたい人は、次の有効な Java コードを検討してください。
Map<String, String> map = new HashMap(){{ put( "foo", new RuntimeException() );
String foo = map.get("foo"); // ClassCastException!!
したがって、ジェネリックスを使用すると、実際の型キャストがコードに表示されなくても CCE を取得できることがわかります。
これが、ジェネリックが明示的な型キャストを取り除くことを許可することを期待する理由です。
また、IIRC C++ ではそれが可能です。