Лучше было бы переместить метод, возвращающий имя в супертип, и использовать один и тот же метод для всех имен. Включение имени типа в имя свойства просто приводит к более длинным идентификаторам без каких-либо дополнительных преимуществ (banana.getName()
было бы так же легко понять, как banana.getBananaName()
, возможно, даже лучше).
Это позволит вам создать ListView<Fruit>
и обрабатывать элементы так же:
listView.setCellFactory(lv -> new ListCell<Fruit>() {
@Override
public void updateItem(Fruit item, boolean empty) {
super.updateItem(item, empty);
setText(empty ? null : item.getName());
}
});
Если вы не можете сделать это, вам нужно проглотить горькую таблетку и использовать instanceof
, чтобы определить тип предмета и соответственно обработать элемент:
listView.setCellFactory(lv -> new ListCell<Object>() {
@Override
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
String text;
if (empty) {
text = null;
} else if (item instanceof Banana) {
text = ((Banana) item).getBananaName();
} else {
text = ((Grapefruit) item).getGrapefruitName();
}
setText(text);
}
});