首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么List<Parent>允许添加新的子项但不允许从List<Child>赋值

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类及其子类的任意类型。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

关于QmlWindow控件不能使用id进行布局定位问题

If you assign an Item to the data list, it becomes a child of the Window's contentItem, so that it appears...data属性允许您在Window中自由混合可视子项,资源和其他Windows。 如果将另一个窗口分配给数据列表,嵌套窗口将变为"瞬态"外部窗口。...如果将一个Item分配给数据列表,它将成为WindowcontentItem子项,以便它出现在窗口内。 项目的父项将是窗口contentItem,它是该窗口中项目所有权树根。...如果指定任何其他对象类型,则将其添加为资源。 通常不需要引用data属性,因为它是Window默认属性,因此所有子项都会自动分配给此属性。...解决方法 使用 parent或 root.contentItem或 Window.contentItem替换 root作为布局锚。

1.2K20
  • 浅谈 React 生命周期

    添加 items ?..., prevState, snapshot) { // 如果我们 snapshot 有值,说明我们刚刚添加 items, // 调整滚动位置使得这些 items 不会将旧 items...过时生命周期方法 以下生命周期方法标记为“过时”。这些方法仍然有效,但不建议在代码中使用它们。...」这一最佳实践,确保生命周期函数行为更加可控可预测,根源上帮助开发者避免不合理编程方式,同时也是在为 「Fiber 架构」 铺路。...至于为什么设计 Hook,为什么要赋予函数组件使用与管理 state 能力,React 官网也在 Hook 介绍 做了深入而详细介绍,总结下来有以下几个点: 便于分离与复用组件状态逻辑(Mixin

    2.3K20

    Android 中为RecyclerView控件添加分隔线

    下面来看一下怎么对RecyclerView中子项添加分隔线: 首先,我们要知道,要对RecyclerView控件中子项添加分隔线,我们要利用RecyclerView.ItemDecoration...c, parent, state); } // 这个方法用于对子项绘制位置进行一些必要调整或者对子项进行一些其他调整。...可以看到,我们这里显示子项之中并没有分割线,那么怎么添加分割线呢?...我们注意到这里分隔线使用了我们自定义资源,因此,我们要在drawable文件夹中新建一个资源文件my_list_divider.xm: <?...好了,RecyclerView控件分隔线就介绍差不多了,RecyclerView控件相当于ListView控件升级版,使用步骤也类似:定义控件、使用适配器添加数据、添加布局管理器、添加分隔线、添加动画效果等等

    2.1K10

    SqlAlchemy 2.0 中文文档(十一)

    如果我们用一个Child对象替换Parent.child值,ORM 工作单元过程将用对象替换以前对象,将以前child.parent_id列默认设置为 NULL,除非设置了特定级联行为...另外,如果进行了冲突更改,例如同时添加了一个Association对象,同时将相同相关Child附加到Parent.children,则在工作单元刷新过程进行时将引发完整性错误,如下例所示: p1...如果我们用一个Child对象替换Parent.child值,ORM 工作单元过程将用对象替换之前对象,将之前child.parent_id列默认设置为 NULL,除非设置了特定级联行为...此外,如果发生冲突更改,例如同时添加Association对象并将相同相关Child附加到Parent.children,则在工作单元刷新过程中会引发完整性错误,如下例所示: p1 = Parent...另外,如果发生冲突更改,例如同时添加一个Association对象,同时将相同相关Child附加到Parent.children,则在工作单元刷新过程进行时,会引发完整性错误,如下例所示: p1

    20210

    电话面试题总结,Python基础部分

    print("c====", c) print("d===", d) print("e===", e) print("f=====", f) # a[1].append('n') 对内部对象进行修改 结果看出赋值...说出你答案并解释 class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print Parent.x..., Child1.x, Child2.x Child1.x = 2 print Parent.x, Child1.x, Child2.x Parent.x = 3 print Parent.x, Child1...为什么改变了 Parent.x 值还会改变 Child2.x 值,但是同时 Child1.x 值却没有改变? 这个答案关键是,在 Python中,类变量在内部是作为字典处理。...认为 list 参数会在 extendList 每次被调用时候会被设置成它默认值 []。 尽管如此,实际发生事情是,默认列表仅仅只在函数被定义时创建一次。

    97820

    最小K个数(手写大顶堆和用优先级队列比较)

    coding-interviews&qru=/ta/coding-interviews/question-ranking 第一种方法,用优先级队列构造出最大堆,然后不断更新最大堆,每次只和堆顶比,如果比堆顶小,删除堆顶,数入堆...,然后堆顶往下一个个比较,相当于把堆顶往下沉,然后到合适位置,堆顶下沉只会赋值一次,并不是下沉时候比较交换),offer会上升恢复堆有序(源码思路:堆底往上一个个比较,相当于把堆底往上浮,堆底上浮只会赋值一次到合适位置...为什么不用for循环去list.add(queue.poll())?虽然也可以出结果,但是queuepoll方法会有下沉恢复堆有序操作,而iterator不会,仅仅是遍历数组。...最后返回ArrayList是满足要求数字但不一定有序(因为数组堆不一定有序),返回这个ArrayList,最后判题系统应该会排序后来判断结果对不对。...,已经是大顶堆了 break; // 往上拉不动了,准备退出把最初堆顶结点赋值到上一个结点 target[k] = big; // 往上拉

    24910

    Python类和对象入门

    首先我们可以定义一个类,这个类中有属性和方法,但有的伙伴会比较好奇,属性和方法不是会封装成对象嘛,为什么又变成类了?举个例子,类就好比是一个毛坯房,而对象是在毛坯房基础上改造成精装房。...,比如为类中weight属性赋予一个值。...当然可以通过自定义类形式实现两个类之间继承关系,我们定义ParentChild两个类,Child中没有任何属性和方法,只是继承于父类Parent。...Python中继承也允许多重继承,也就是说一个子类可以继承多个父类中属性和方法,但是这类操作会导致代码混乱,所以大多数情况下不推荐使用,这里就不过多介绍了。...class Parent: pass class Child(Parent): pass print(issubclass(Child,Parent)) ''' True ''' 需要注意有两点

    42440

    Python类和对象(长文系列第⑤篇)

    首先我们可以定义一个类,这个类中有属性和方法,但有的伙伴会比较好奇,属性和方法不是会封装成对象嘛,为什么又变成类了?举个例子,类就好比是一个毛坯房,而对象是在毛坯房基础上改造成精装房。...,比如为类中weight属性赋予一个值。...当然可以通过自定义类形式实现两个类之间继承关系,我们定义ParentChild两个类,Child中没有任何属性和方法,只是继承于父类Parent。...Python中继承也允许多重继承,也就是说一个子类可以继承多个父类中属性和方法,但是这类操作会导致代码混乱,所以大多数情况下不推荐使用,这里就不过多介绍了。...class Parent: pass class Child(Parent): pass print(issubclass(Child,Parent)) ''' True ''' 需要注意有两点

    30820

    Android之微信朋友圈UI实现--ExpandableListView+GridView

    步骤: 总布局创建,里面只要一个ExpandableListView控件。 ExpandableListViewitem布局创建,本布局用最传统做法分为Group和Child布局。...这里文件非常简单,只有一个控件,当然ExpandableListView也是有很多属性。这里都没有写,去掉箭头,在Activity中动态添加。...3.1:方法作用详情(没有先后顺序,古无序号) 首先定义变量(这里listChild为什么list里泛型还是list,我在Activity中解释)   public Context context;...,这里我解释一下list嵌套list,比如说一共是10个组,每个组里有一个子项目,每个子项目中又有2个图片 List> listChild = new ArrayList..."); list.add(childBean);//添加到子中 } listChild.add(list);

    1.2K30

    前端面试指南之React篇(二)

    使用者角度而言,很难使用体验上区分两者,而且在现代浏览器中,闭包和类性能只在极端场景下才会有明显差别。所以,基本可认为两者作为组件是完全一致。...在函数组件内部操作副作用是不被允许,所以需要使用这两个函数去处理。...为什么有些react生命周期钩子被标记为UNSAFEcomponentWillMountcomponentWillMount生命周期发生在首次渲染前,一般使用小伙伴大多在这里初始化数据或异步获取外部数据赋值...(nextProps.list[0]); //默认选择第一个 } ...}如上代码,在Child组件componentWillReceiveProps里直接调用Parent组件changeSelectData...会触发Parent组件重新渲染,而Parent组件重新渲染会触发Child组件componentWillReceiveProps生命周期函数执行。如此就会陷入死循环。导致程序崩溃。

    2.8K120

    腾讯前端必会react面试题合集_2023-02-27

    这样做主要原因是受控组件支持即时字段验证,允许有条件地禁用/启用按钮,强制输入格式。...Keys 是 React 用于追踪哪些列表中元素被修改、被添加或者被移除辅助标识。 在 React 中渲染集合时,向每个重复元素添加关键字对于帮助React跟踪元素与数据之间关联非常重要。...为此,React将构建一个 React 元素树(您可以将其视为 UI 对象表示) 一旦有了这个树,为了弄清 UI 如何响应状态而改变,React 会将这个树与上一个元素树相比较( diff...// 子组件: Child const Child = props =>{ return {props.name} } // 父组件 Parent const Parent = ()=...这里用到了解构赋值,所以先来看一下ES6 解构赋值: 数组解构赋值 const foo = [1, 2, 3]; const [one, two, three] = foo; console.log

    1.7K20

    RecyclerView 使用总结

    TextWatcher 后,每次执行刷新、添加数据之类操作,即只要执行 onBindViewHolder 就会进入监听,导致数据错乱。...support-v7:24.2.0 中新增了工具类 DiffUtil,用来比较两个数据集,寻找出旧数据集/数据集最小变化量。...implementation "android.arch.paging:runtime:1.0.1" DataSource 数据源,可以网络获取或本地获取要显示数据。...以 Wrap 开头三个类,名字和源码可以看出就是一个装饰,构造方法传入被装饰那个类和一个 Function,除了加载数据方法外都是直接委托给被装饰类,加载数据方法将 Value 经过 Function...LoadInitialParams 内有两个属性: requestedLoadSize 要加载数据个数 placeholdersEnabled 没有数据时是否允许显示占位 LoadParams

    3.5K20
    领券