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)
Другие вопросы по тегам