对象和抽象的 ArrayList

ArrayList of objects and abstract

我正在尝试学习 Java 中的通配符。在这里,我试图修改 printCollection 方法,以便它只需要扩展 AbstractList 的 class。它显示评论中的错误。我尝试使用 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);
    }

}

您正在请求一个 AbstractList 对象的集合,例如一个包含 AbstractList 的列表。这真的是你想要的吗?

解决它的一种方法是...

<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)