Я пытаюсь сделать 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++ допускает это.
<T extends A> T setX() { return (T)this; }
, но обратите внимание, что здесь вы опускаетесь. - person Luiggi Mendoza   schedule 17.06.2013