Вместо этого переместив мой пост скриптум, чтобы люди не тратили свое время, если я разместил это на неправильном сайте: я не мог решить, принадлежал ли он здесь или на https://codereview.stackexchange.com. Если последнее считается более подходящим, я рад видеть, что это перемещено.
У меня есть параметризованный интерфейс с методом, который принимает Consumer
и, если выполняется определенное условие, вызывает его с this
в качестве параметра. В противном случае он возвращает this
(чтобы сделать его цепочкой на сайте вызовов, как вы, возможно, уже собрали):
public interface SomeInterface<T> {
boolean someCondition();
default SomeInterface<T> someMethod(
Consumer<SomeInterface<? extends T>> action) {
if (someCondition()) {
action.accept(this);
}
return this;
}
Теперь я хотел бы расширить эту функциональность, добавив еще один параметр, чтобы я мог возвращать вызывающей стороне дополнительную информацию:
public interface SomeInterfaceExtended<T, U> extends SomeInterface<T> {
U getAdditionalInformation();
@Override
SomeInterfaceExtended<T, U> someMethod(
Consumer<SomeInterfaceExtended<? extends T, U>> action) {
if (someCondition()) {
action.accept(this);
}
return this;
}
}
Это, конечно, не работает, так как оба метода имеют одинаковое стирание. В итоге я не расширил интерфейс, а определил все те же методы и поручил разработчикам «расширенного» интерфейса делегировать экземпляр «базового» интерфейса:
public interface SomeInterface<T> {
boolean someCondition();
default SomeInterface<T> someMethod(
Consumer<SomeInterface<? extends T>> action) {
if (someCondition()) {
action.accept(this);
}
return this;
}
...
public interface SomeInterfaceExtended<T, U> {
U getAdditionalInformation();
boolean someCondition();
default SomeInterfaceExtended<T, U> someMethod(
Consumer<SomeInterfaceExtended<? extends T, U>> action) {
if (someCondition()) {
action.accept(this);
}
return this;
}
}
...
public class SomeClass<T> implements SomeInterface<T> {
@Override
public boolean someCondition() {
// whatever
}
}
...
public class SomeClassExtended<T, U> implements SomeInterfaceExtended<T, U> {
private final SomeClass<T> delegate;
private final U additionalInformation;
public SomeClassExtended(SomeClass<T> delegate, U additionalInformation) {
this.delegate = delegate;
this.additionalInformation = additionalInformation;
}
@Override
public boolean someCondition() {
return delegate.someCondition();
}
}
Все это кажется немного неуклюжим / вздутым. Есть ли способ, которым я могу более эффективно (локально) поделиться реализацией?