Pull to refresh

Comments 21

1) убираем ручное приведение типов
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();
}
Если посмотреть на исходный код JPA, то там несколько иная реализация и иные цели.

В моём примере я в любой момент могу расширить класс ChildClass своим методом, которого нет в IChildParam и точно так же вызвать его в череде вызовов.

Как думаете, стоит расширить код и показать такой пример?
UFO just landed and posted this here
рекурсия пост-комментарий?
По теме Java Wildcards действительно очень мало информации на русском языке. Спасибо, что внесли свой вклад.
Жду в следующий раз рассказ про <T super class>
я обычно решал такую задачу через типизацию this:
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 простите за код — что-то не выходит у меня с разметкой
мне кажется там несколько более усложнённый код для той же цели
Согласен, интерфейс тут не обязателен — изначально, когда писал пост, было 2 дочерних класса и думал показать пример с ними, но позже решил упростить и оставил только один дочерний класс, а вот интерфейс остался :)
в коммите добавил в пакет ru.itbasis.demo.java.self.child.woi пример без интерфейса.
и еще, вот это:
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
«Слегка нарушим правило», чтобы потом нарушить принцип разделения команд и запросов? :)
Хотя я тут несколько неправ. Fluent interface может сосуществовать с CQRS требуемым ограничением (по определению) что такие set-методы должны возвращать тот же объект без изменений либо быть конечным и возвращать void
Sign up to leave a comment.

Articles