java - 无法将 ArrayList<Impl> 传递给采用 ArrayList<Interface> 的方法

标签 java generics interface

我有一个接口(interface)和一个实现它的类:

public interface IFoo{
    Integer bar();
}

public class Foo implements IFoo{
    @Override
    public Integer bar(){
        return 42;
    }
}

现在在另一个类中,我有一个接受接口(interface)类型的 ArrayList 的函数。

public class Something {
    public static void function(ArrayList<IFoo> foos){
        //do something on foos
    }
}

我想在 Foo 的数组列表上使用这个函数:

ArrayList<Foo> myFoos = new ArrayList<Foo>();
Something.function(myFoos);//can NOT do this

有什么问题或我该怎么办?

最佳答案

泛型来拯救!

public static void function(ArrayList<? extends IFoo> foos){
    //do something on foos
}

现在函数接受任何类型的数组列表,其中包含的类型是 IFoo 或派生自它。

就其值(value)而言,尽可能使用最通用的类​​型也是一个好主意。您真的需要 ArrayList 吗?或者任何类型的 List 都可以吗?或者可能是任何类型的Collection

public static void function(List<? extends IFoo> foos);
public static void function(Collection<? extends IFoo> foos);

一个好的经验法则是 be conservative in what you send and liberal in what you accept from others .使用更通用的参数类型属于“自由”部分。

关于java - 无法将 ArrayList<Impl> 传递给采用 ArrayList<Interface> 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26093161/

相关文章:

java - 调用 Calendar 类函数会产生 GC_CONCURRENT 消息

java - 如何引用当前类的类型?

java - Java中的接口(interface)是什么?

java - 如何正确设计界面

java - 使用 BeanUtils.copyProperties 时如何维护数值为 null?

java - 如何根据对象从 map 中检索值

java - imgpanel.setImage(im);在按钮按下功能下的循环中不起作用,但一次性工作正常

java - 试图理解 Java 中的泛型

c# - C# 中的泛型和继承类型

java - 无需子类继承减少代码重复