List<Parent>允许添加新的子项但不允许从List<Child>赋值的原因是因为Java中的泛型是不可协变的。
泛型是为了提高代码的类型安全性而引入的,它允许在编译时检查集合中元素的类型。List<Parent>表示这个列表只能存储Parent类型的元素,而List<Child>表示这个列表只能存储Child类型的元素。
如果允许从List<Child>赋值给List<Parent>,那么就有可能在编译时期无法检查出类型不匹配的错误。例如,假设List<Child>可以赋值给List<Parent>,然后我们尝试将一个Parent类型的对象存储到List<Child>中,由于List<Child>只能存储Child类型的元素,这就导致了类型不匹配的错误。
但是,List<Parent>允许添加新的子项是因为Parent是Child的父类,Child类型的对象可以被视为Parent类型的对象,因此我们可以通过List<Parent>来添加Child类型的元素,这是合法的。
总结起来,Java中的泛型是不可协变的,List<Parent>和List<Child>是不同的类型,尽管Parent是Child的父类。这是为了保证类型的安全性,避免在编译时期出现类型不匹配的错误。如果需要实现类似的协变功能,可以使用通配符? extends Parent来表示List中的元素是Parent类及其子类的任意类型。
领取专属 10元无门槛券
手把手带您无忧上云