Мне нужно сохранить B и C в одном списке, потому что я хочу отсортировать их на основе их общих атрибутов, которые я могу.
Поскольку требуется, чтобы список сортировался со смешанными типами B
, C
, оба расширяющих A
, для вызова их не унаследованных методов, у вас нет выбора, кроме как использовать List<A>
, содержащий все типы.
Хотя я также стараюсь избегать принижения, когда это возможно, это не означает, что существуют ситуации, когда это ни полезно, ни необходимо.
for (A item: sortedList) {
if (item instanceof B) {
Whatever fieldB = ((B) item).getFieldB(); // using non-inherited method of B
} else if (item instanceof C) {
Whatever fieldC = ((C) item).getFieldC(); // using non-inherited method of C
} else {
// either only A or anything different that extends A
}
}
Как Java 14 благодаря JEP 305: сопоставление с образцом, например , такая вещь становится менее многословной:
for (A item: sortedList) {
if (item instanceof B b) {
Whatever fieldB = b.getFieldB(); // using non-inherited method of B
} else if (item instanceof C c) {
Whatever fieldC = c.getFieldC(); // using non-inherited method of C
} else {
// either only A or anything different that extends A
}
}