Как расширить абстрактный класс с помощью универсалий в Java?

#java

Вопрос:

Я надеюсь узнать немного о дженериках на Java с помощью этого вопроса.

Я создал следующий абстрактный класс, который я хотел бы расширить:

 import javafx.scene.control.Button;
import javafx.scene.control.TableCell;

public abstract class TableCellWithButton<DataType, InfoType> extends TableCell<DataType, InfoType> {
    final Button button;

    public TableCellWithButton(Button button) {
        this.button = button;
    }

    @Override
    public void updateItem(
            InfoType item,
            boolean empty
    ) {
        super.updateItem(
                item,
                empty
        );
        if (empty) {
            setGraphic(null);
            setText(null);
        } else {
            button.setOnAction(event -> {
                buttonClickHandler(this);
            });
            setGraphic(button);
            setText(null);
        }
    }

    abstract void buttonClickHandler(TableCell<DataType, InfoType> cell);
}
 

Однако, когда я пытаюсь расширить функцию следующим образом…

 import javafx.scene.control.TableCell;

public class ActiveLoansTableCellWithButton extends TableCellWithButton<Debt, String> {

    @Override
    public void buttonClickHandler(TableCell<Debt, String> cell) {
        // Trying to extend here...
    }
}
 

Я получаю следующую ошибку:

Класс «ActiveLoansTableCellWithButton» должен быть либо объявлен абстрактным, либо реализовать абстрактный метод » buttonClickHandler(табличная ячейка<Тип данных, инфотип>)» в «табличной кнопке».

Очевидно, что я не переопределяю свой buttonClickHandler метод TableCellWithButton . Чего мне не хватает, что мешает мне успешно переопределить мой метод?

Скриншот моей IDE:

введите описание изображения здесь

Комментарии:

1. » Очевидно, что я не переопределяю свой buttonClickHandler метод в TableCellWithButton » — Компилятор также жалуется на @Override -аннотацию? Если нет, то вы правильно переопределяете метод. Может ли быть так, что есть (есть) дополнительные абстрактные методы TableCell , которые вам нужно реализовать?

2. @Turing85 Да, компилятор и Intellij жалуются на меня по одному и тому же поводу. Я только что обновил свой пост полным сообщением об ошибке, чтобы показать, что, похоже, я определенно неправильно переопределяю 🙁

3. @Turing85 только что добавил скриншот моей IDE, содержащий код для дополнительного доказательства 🙂

4. сделайте метод общедоступным (или защищенным) в абстрактном классе TableCellWithButton . Поскольку оба класса находятся в разных пакетах, конкретный класс не может «видеть» абстрактный метод

5. @k5_ возможно, вы захотите оставить свой комментарий в качестве ответа 🙂

Ответ №1:

Метод buttonClickHandler в TableCellWithButton пакете является закрытым (не имеет модификатора видимости). Таким образом, метод может быть переопределен только классами в одном пакете.

На предоставленном скриншоте оба класса находятся в разных пакетах.

Поэтому либо переместите оба класса в один и тот же пакет, либо измените видимость метода на общедоступную (или защищенную)