假设类A
实现了接口B
,是否可以将List<A>
传递给带参数List<B>
的函数:
List<A> var1;
如何调用(通过一些修复):func(var1)
void func(List<B> var){
}
任何建议都将不胜感激。谢谢!
答案 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);