Как сделать так, чтобы потребитель более точного типа передавался как потребитель менее точного типа? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть следующие два функциональных интерфейса:

IndexBytePairConsumer.java

package me.theeninja.nativearrays.core;

@FunctionalInterface
public interface IndexBytePairConsumer {
    void accept(long index, byte value);
}

IndexIntPairConsumer.java

package me.theeninja.nativearrays.core;

@FunctionalInterface
public interface IndexIntPairConsumer {
    void accept(long index, int value);
}

У меня также есть следующий метод:

public void forEachIndexValuePair(IndexBytePairConsumer indexValuePairConsumer) {
    ...
}

Можно ли каким-либо образом разрешить передачу IndexIntPairConsumer в указанном выше методе (поскольку потребитель целых чисел может принимать байты)? Мне необходимо использовать примитивы в сигнатурах методов, а не в связанных классах, таких как Integer и Byte, поэтому любая абстракция становится намного сложнее.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Без изменения иерархии типов (например, способ, предложенный в в этом ответе ), шаг адаптации неизбежен, так как IndexBytePairConsumer и IndexIntPairConsumer - это два разных типа.Наименьший шаг адаптации будет

// given
IndexIntPairConsumer consumer = …

// call as
forEachIndexValuePair(consumer::accept);

. Как вы сказали в своем вопросе, потребитель целых чисел может принимать байты, поэтому accept метод IndexIntPairConsumer является действительной целью для ссылки на метод, гдеожидается IndexBytePairConsumer.

0 голосов
/ 12 декабря 2018

Вот то, что я изобрел для вас.

Определите

public interface IndexBytePairConsumer {
    void accept(long index, byte value);
}

public interface IndexIntPairConsumer extends IndexBytePairConsumer {
    default void accept(long index, byte value) {
        this.accept(index, (int) value);
    }

    void accept(long index, int value);
}

, и вы можете использовать его

IndexIntPairConsumer c = (a,b)->{
    System.out.println(a + b);
};
forEachIndexValuePair(c);

forEachIndexValuePair((a, b) -> {
    System.out.println(a + b);
});
...