ArrayList объектов и аннотация
Я пытаюсь изучать подстановочные знаки в Java. Здесь я пытаюсь изменить printCollection
метод, так что он будет принимать только класс, который расширяет AbstractList
, Это показывает ошибку в комментарии. Я пытался использовать ArrayList
объектов, он работает нормально. Я использую Java 7.
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
public class Subtype {
void printCollection(Collection<? extends AbstractList<?>> c) {
for (Object e : c) {
System.out.println(e);
}
}
public static void main(String[] args) {
Subtype st= new Subtype();
ArrayList<String> al = new ArrayList<String>();
al.add("a");
al.add("n");
al.add("c");
al.add("f");
al.add("y");
al.add("w");
//The method printCollection(Collection<? extends AbstractList<?>>) in the type Subtype is not applicable for the
// arguments (ArrayList<String>)
st.printCollection(al);
}
}
2 ответа
Вы запрашиваете коллекцию объектов AbstractList, например, список, заполненный AbstractLists. Это действительно то, что вы хотели?
Один из способов ее решения был бы...
<T extends AbstractList<?>> void printCollection(T c) {
... таким образом, ваш метод будет принимать только объекты, расширяющие AbstractLists любым общим содержимым.
Но, как уже отмечали другие комментаторы, постеры и писатели (J. Bloch: Effective Jave, p134+), лучшим стилем было бы просто попробовать что-то вроде этого:
void printCollection(AbstractList<?> c) {
В вашем коде вы предполагаете, что параметр должен реализовывать Collection
и должен содержать элементы, которые расширяются AbstractList
void printCollection(Collection<? extends AbstractList<?>> c)
Чтобы получить то, что вы хотите, вы можете просто написать это так:
void printCollection(AbstractList<?> c)