我有一个接口(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/