Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象和抽象的数组列表_Java_Arraylist_Wildcard_Subtyping - Fatal编程技术网

Java 对象和抽象的数组列表

Java 对象和抽象的数组列表,java,arraylist,wildcard,subtyping,Java,Arraylist,Wildcard,Subtyping,我正在努力学习Java中的通配符。在这里,我试图修改printCollection方法,以便它只接受扩展AbstractList的类。它在注释中显示错误。我尝试使用对象的ArrayList,效果很好。我正在使用Java7 import java.util.AbstractList; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; publi

我正在努力学习Java中的通配符。在这里,我试图修改
printCollection
方法,以便它只接受扩展
AbstractList
的类。它在注释中显示错误。我尝试使用对象的
ArrayList
,效果很好。我正在使用Java7

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

}
import java.util.AbstractList;
导入java.util.ArrayList;
导入java.util.Collection;
导入java.util.List;
导入java.util.Set;
公共类子类型{
作废打印集合(集合>c){
用于(对象e:c){
系统输出打印ln(e);
}
}
公共静态void main(字符串[]args){
子类型st=新的子类型();
ArrayList al=新的ArrayList();
al.添加(“a”);
al.添加(“n”);
al.添加(“c”);
al.添加(“f”);
al.添加(“y”);
al.添加(“w”);
//类型子类型中的方法printCollection(Collection>)不适用于
//参数(ArrayList)
圣普林特收藏(al);
}
}

您要求的是一组AbstractList对象,例如一个用AbstractList填充的list。这真的是你想要的吗

解决这个问题的一个办法是

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

您请求的是一组AbstractList对象,例如一个列表,其中填充了AbstractList。这真的是你想要的吗

解决这个问题的一个办法是

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

在代码中,您假设参数应该实现
集合
,并且应该包含扩展
抽象列表

void printCollection(Collection<? extends AbstractList<?>> c)
void printCollection(Collection>c)
要得到你想要的,你可以这样写:

void printCollection(AbstractList<?> c) {
void printCollection(AbstractList<?> c)
void printCollection(抽象列表c)

在代码中,您假设参数应该实现
集合
,并且应该包含扩展
抽象列表

void printCollection(Collection<? extends AbstractList<?>> c)
void printCollection(Collection>c)
要得到你想要的,你可以这样写:

void printCollection(AbstractList<?> c) {
void printCollection(AbstractList<?> c)
void printCollection(抽象列表c)

谢谢你说的没错,但我无法理解这是如何工作的。很抱歉,我无法重复一本好书的内容。我建议参考一些Java泛型教程或书籍。我使用此链接阅读有关通配符的内容。这是一个好主意,但对于初学者来说,可能有比oracle文档更基本的解释,如果你问我的话,oracle文档往往还可以,但这对新手来说并不友好。@FlorianSchaetz:我唯一要补充的是,形式类型参数
T
,在方法签名中只出现一次。在这种情况下,通过使用有界通配符(effectivejava,第二版,J.Block)提供了一个更灵活的API。谢谢你的正确性,但我无法理解这是如何工作的。很抱歉,我无法真正重复一本好书中需要解释的内容。我建议参考一些Java泛型教程或书籍。我使用此链接阅读有关通配符的内容。这是一个好主意,但对于初学者来说,可能有比oracle文档更基本的解释,如果你问我的话,oracle文档往往还可以,但这对新手来说并不友好。@FlorianSchaetz:我唯一要补充的是,形式类型参数
T
,在方法签名中只出现一次。在本例中,通过使用有界通配符(effectivejava,第二版J.Block)提供了一个更灵活的API。我认为这是一个更好的答案。如果可能的话,在方法签名中使用有界通配符可以产生更灵活的API。我认为这是一个更好的答案。如果可能,在方法签名中使用有界通配符可以产生更灵活的API。是否有具体原因让您只允许扩展
AbstractList
的列表,而不是所有实现
List
接口(契约)的列表?通过指定
AbstractList
,您将代码耦合到特定的实现。只要有可能,您应该为接口而不是实现编写代码。@Mick助记符谢谢,我会记住这一点。您是否有特定的原因只允许扩展
AbstractList
的列表,而不是所有实现
List
接口(契约)的列表?通过指定
AbstractList
,您将代码耦合到特定的实现。只要有可能,您应该为接口而不是实现编写代码。@Mick助记符谢谢,我会记住这一点。