Расширяет ли класс, который реализует метод интерфейса (без явной реализации этого интерфейса) этот конкретный интерфейс? - PullRequest
0 голосов
/ 04 ноября 2018

Я реализую класс для хранения объектов, которым можно присвоить значение double . По этой причине я создал интерфейс HasDoubleValue , который содержит один метод:

public interface HasDoubleValue{
    public double doubleValue();
}

Мой основной класс определяется так:

Data <O extends HasDoubleValue> {...}

Теперь, когда я пытаюсь инициализировать этот класс для хранения целых чисел, я получаю сообщение об ошибке «Аргумент типа Integer находится за пределами переменной типа O», хотя Integer реализует метод doubleValue () с помощью по умолчанию.

Я полагаю, что это происходит потому, что Integer явно не реализует мой интерфейс HasDoubleValue, хотя у него есть метод, который я ищу. Это правильно? Каким будет естественный обходной путь?

1 Ответ

0 голосов
/ 04 ноября 2018

Да, это правильно. Java не использует типизацию утили как JavaScript или TypeScript.

Решение состоит в том, чтобы создать класс адаптера, который упаковывает целое число, делегирует его и фактически реализует интерфейс.

Или, поскольку в этом случае ваш интерфейс является функциональным, использовать лямбду или ссылку на метод для создания экземпляра HasDoubleValue из Integer.

public interface HasDoubleValue{
    double doubleValue();
}

final class IntegerHasDoubleValueAdapter implements HasDoubleValue {
    private final Integer i;

    public IntegerHasDoubleValueAdapter(Integer i) {
        this.i = i;
    }

    @Override
    public double doubleValue() {
        return i.doubleValue();
    }
}

class Data<O extends HasDoubleValue> {
    void put(O o) {}

    public static void main(String[] args) {
        Integer i = 42;

        Data<IntegerHasDoubleValueAdapter> d1 = new Data<>();
        d1.put(new IntegerHasDoubleValueAdapter(i));

        Data<HasDoubleValue> d2 = new Data<>();
        d2.put(() -> i.doubleValue());

        Data<HasDoubleValue> d3 = new Data<>();
        d3.put(i::doubleValue);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...