Причина вашей проблемы в том, что вы объявляете тип ArrayList<?>
, что означает «список, который должен содержать только определенный тип, но я не знаю, какой». Это приводит к тому, что единственное, что вы знаете об объектах, исключенных из списка, это то, что они имеют тип Object
, потому что все есть (кроме примитивов, которые не могут быть в коллекции). Но что еще более важно, вы не можете поместить что-либо в список, потому что вы не знаете, к какому типу оно относится.
Вот почему использование подстановочного знака ?
очень редко подходит. Почти во всех случаях вы должны использовать конкретный тип или именованный ограниченный тип:
private static void swapKundeData(List<Kunde> data, int index1, int index2) {
Kunde temporary = data.get(index1);
data.set(index1, data.get(index2));
data.set(index2, temporary);
}
Обратите внимание на использование интерфейса List
, который делает код гораздо более гибким в отношении того, что он принимает.
private static <T> void swap(List<T> data, int index1, int index2) {
T temporary = data.get(index1);
data.set(index1, data.get(index2));
data.set(index2, temporary);
}
Это обобщенное решение действительно , которое безопасно для типов, но не должно знать, какой тип элементов списка. Вы на самом деле не получаете никакой безопасности типов, используя здесь Generics (Object
будет так же хорошо), но вы можете, например, вернуть один из замененных элементов, и компилятор узнает, что возвращаемое значение того же типа, что и элементы списка.