Java:如何使用接口参数类型将变量传递给函数

时间:2013-09-06 23:58:42

标签: java

假设类A实现了接口B,是否可以将List<A>传递给带参数List<B>的函数:

List<A> var1;

如何调用(通过一些修复):func(var1)

void func(List<B> var){
}

任何建议都将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:1)

不可能(至少,没有一些怪诞的铸造)。一个不是另一个的超类型。

答案 1 :(得分:1)

当然:func(Collections.<B>unmodifiableList(var1))。只要你能保证列表没有被修改,那种呼叫是安全的。

答案 2 :(得分:0)

没有。 List<A>不是List<B>的子类型。

原因是,如果您有List<B>,则可以向其添加对象,其类是B的任何实现。你不能对List<A>这样做。因此,有List<B>但不是List<A>的操作正常;这意味着List<A>不一定是List<B>

我认为您真正想要的是使用List<? extends B>作为参数的类型,而不是List<B>

答案 3 :(得分:0)

多么奇怪的想法,试图绕过类型检查。

A类和B类是否具有相同的属性?如果是,请考虑复制它们 org.apache.commons.beanutils。 BeanUtils.copyProperties (src,dest)并在一些转换方法中包装List参数。

如果你坚持传递一些通常不兼容的东西,那么这样的东西应该有效,因为类型擦除

List x = var1;
func(x);