Java расширяет параметризованный интерфейс дополнительным параметром типа - PullRequest
0 голосов
/ 04 мая 2018

Вместо этого переместив мой пост скриптум, чтобы люди не тратили свое время, если я разместил это на неправильном сайте: я не мог решить, принадлежал ли он здесь или на 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();
  }
}

Все это кажется немного неуклюжим / вздутым. Есть ли способ, которым я могу более эффективно (локально) поделиться реализацией?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...