#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
пакете является закрытым (не имеет модификатора видимости). Таким образом, метод может быть переопределен только классами в одном пакете.
На предоставленном скриншоте оба класса находятся в разных пакетах.
Поэтому либо переместите оба класса в один и тот же пакет, либо измените видимость метода на общедоступную (или защищенную)