为何List<List<String>>无法转换为Collection<Collection<String>>?
问题:List<List>无法转换为Collection<Collection>的原因
报错信息
/MyClass.java:10: error: incompatible types: List<List<String>> cannot be converted to Collection<Collection<String>> method(matrix);
代码示例
import java.util.Collection; import java.util.List; public class MyClass { public static void main(String args[]) { List<List<String>> matrix = List.of( List.of("q", "w", "e", "r", "t", "y"), List.of("1", "2", "3", "4", "5", "6") ); method(matrix); } private static void method(Collection<Collection<String>> matrix){ //method here return; } }
错误原因
这是Java泛型不变性导致的类型不兼容问题:
- 虽然
List是Collection的子类型,但泛型类型本身不具备协变性。也就是说,List<List<String>>和Collection<Collection<String>>之间不存在继承关系,哪怕它们的泛型参数是父子类型。 - Java编译器禁止这种转换是为了保证类型安全:假设允许转换,那么在
method方法中,你可以向matrix添加一个Set<String>(它属于Collection<String>的子类型),但实际传入的matrix是List<List<String>>,根本无法容纳Set<String>,这会导致运行时类型错误。
如果要解决这个问题,只需将方法签名修改为:
private static void method(Collection<? extends Collection<String>> matrix)
使用? extends通配符声明泛型的上界,允许传入任何Collection的子类型,且其元素是Collection<String>或其子类型(比如List<String>)。
内容的提问来源于stack exchange,提问作者Andrés Camilo Arcila Ortiz
相关产品推荐
相关产品推荐

