0

我正在尝试在 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);
    }

}
4

2 回答 2

2

在您的代码中,您假设参数应该实现Collection并且应该包含扩展的元素AbstractList

void printCollection(Collection<? extends AbstractList<?>> c)

要得到你想要的,你可以简单地这样写:

void printCollection(AbstractList<?> c)
于 2015-08-16T06:00:00.680 回答
2

您正在请求一个 AbstractList 对象的集合,例如一个列表,其中填充了 AbstractLists。这真的是你的意图吗?

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

<T extends AbstractList<?>> void printCollection(T c) {

...这样,您的方法将只接受扩展具有任何通用内容的 AbstractLists 的对象。

但正如其他评论者、海报和作家(J. Bloch:Effective Jave,p134+)已经正确指出的那样,更好的风格是简单地尝试这样的事情:

void printCollection(AbstractList<?> c) {
于 2015-08-16T05:38:35.810 回答