Как инициализировать абстрактный номер в 0? - PullRequest
0 голосов
/ 24 марта 2020

Я хотел бы инициализировать переменную, которая является расширением класса Number. Мой тест:

class IgniteReducer<T extends Number> {

    private T sum = (Number) 0; // Here I have the problem

    public boolean collect(T number) {
        sum += number;
        return true;
    }

    public T reduce() {
        return sum;
    }

}

У кого-нибудь есть идеи, как решить эту инициализацию?

1 Ответ

1 голос
/ 24 марта 2020

Вы не можете этого сделать. Нет универсального c способа установить Number в 0. Как сказал Джони в комментарии, нет универсального c способа добавления двух экземпляров одного и того же подкласса Number.

Один из вариантов - отложить эти две операции до подкласса, который знает конкретный тип, который представляет T. Таким образом, ваш основной класс должен быть абстрактным.

abstract class IgniteReducer<T extends Number> {

    protected T sum = zero();

    protected abstract T zero();

    public abstract boolean collect(T number);

    public T reduce() {
        return sum;
    }

}

Одна конкретная реализация может быть:

class IgniteFloatReducer extend IgniteReducer<Float> {

    Float zero() {
        return 0;
    }

    public boolean collect(Float number) {
        sum += number;
        return true;
    }

}

Я набрал код здесь без его тестирования, поэтому, пожалуйста, простите за любую опечатку.

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