0

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

List<A> var1;

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

void func(List<B> var){
}

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

4

4 回答 4

1

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

于 2013-09-07T00:05:03.480 回答
1

当然: func(Collections.<B>unmodifiableList(var1))。只要您可以保证列表没有被修改,这种调用是安全的。

于 2013-09-07T00:09:06.313 回答
0

No. List<A>不是 的子类型List<B>

原因是如果你有一个List<B>,你可以向它添加对象,其类是 的任何实现B。你不能对List<A>. 所以有些操作适用于 aList<B>但不适用于 a List<A>; 这意味着 aList<A>不可能是一种List<B>

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

于 2013-09-07T00:25:43.387 回答
0

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

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

如果你坚持传递一些通常不兼容的东西,由于类型擦除,这样的东西应该可以工作:

List x = var1;
func(x);
于 2013-09-07T00:26:55.223 回答