Комментарии 21
спасибо за статью, всё понятно
но ведь точно тоже самое есть на вики?
но ведь точно тоже самое есть на вики?
1) убираем ручное приведение типов
2) выносим проверку приведения типа с уровня Runtime на этап компиляции
2) выносим проверку приведения типа с уровня Runtime на этап компиляции
эм. из-за того, что вы изменили комментарий, мой стал неактуален.
Отвечу на ваш изменённый.
А где на вики? по той ссылке, что приведена в начале поста, описан только сам «текучий интерфейс», но там нет примера применения с использованием наследования классов
Отвечу на ваш изменённый.
А где на вики? по той ссылке, что приведена в начале поста, описан только сам «текучий интерфейс», но там нет примера применения с использованием наследования классов
применение там есть
Некоторые API в Java реализуют такой интерфейс, например Java Persistence API:
public Collection<Student> findByNameAgeGender(String name, int age, Gender gender) {
return em.createNamedQuery("Student.findByNameAgeGender")
.setParameter("name", name)
.setParameter("age", age)
.setParameter("gender", gender)
.setFirstResult(1)
.setMaxResults(30)
.setHint("hintName", "hintValue")
.getResultList();
}
del
НЛО прилетело и опубликовало эту надпись здесь
Недавно видел лекцию на подобную тему. Может кому пригодится: Рекурсивное расширение типа
По теме Java Wildcards действительно очень мало информации на русском языке. Спасибо, что внесли свой вклад.
Жду в следующий раз рассказ про
Жду в следующий раз рассказ про
<T super class>
я обычно решал такую задачу через типизацию this:
как-то так — и интерфейс не нужен и доп касты, как вот здесь
((ChildClass) new ChildClass().setBaseParam(BASE_PARAM)).setChildParam(CHILD_PARAM);
PS простите за код — что-то не выходит у меня с разметкой
Base<T extends Base<T>> {
protected T getThis() { return this; }
public T setBaseParam(int base) { this.base = base; return getThis(); }
}
Child extends Base<Child> {
public T setChildParam(int child) { ... return getThis(); }
}
как-то так — и интерфейс не нужен и доп касты, как вот здесь
((ChildClass) new ChildClass().setBaseParam(BASE_PARAM)).setChildParam(CHILD_PARAM);
PS простите за код — что-то не выходит у меня с разметкой
быстрое гугление дало вот такую более подробную статью weblogs.java.net/node/642849
Согласен, интерфейс тут не обязателен — изначально, когда писал пост, было 2 дочерних класса и думал показать пример с ними, но позже решил упростить и оставил только один дочерний класс, а вот интерфейс остался :)
в коммите добавил в пакет
в коммите добавил в пакет
ru.itbasis.demo.java.self.child.woi
пример без интерфейса.и еще, вот это:
неверно.
У Вас типизированный класс BaseClass используется в unchecked версии (примерно то же самое, как написать List x = (List) new ArrayList()). Это может привести к трудноуловимым проблемам с типизацией позднее. См мой вопрос stackoverflow.com/questions/3067891/what-would-be-different-in-java-if-enum-declaration-didnt-have-the-recursive-pa
BaseClass<T extends BaseClass>
неверно.
У Вас типизированный класс BaseClass используется в unchecked версии (примерно то же самое, как написать List x = (List) new ArrayList()). Это может привести к трудноуловимым проблемам с типизацией позднее. См мой вопрос stackoverflow.com/questions/3067891/what-would-be-different-in-java-if-enum-declaration-didnt-have-the-recursive-pa
Да, спасибо за замечание.
Кстати, IDEA тоже не очень корректно отрабатывает в таких ситуациях: youtrack.jetbrains.com/issue/IDEA-126457
Кстати, IDEA тоже не очень корректно отрабатывает в таких ситуациях: youtrack.jetbrains.com/issue/IDEA-126457
«Слегка нарушим правило», чтобы потом нарушить принцип разделения команд и запросов? :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Возвращаем дочерний класс из родительского. Факультатив