所以我查看了一些Java代码并偶然发现:
List<? extends SomeObject> l;
基本上,此列表接受所有属于SomeObject的对象-
SomeObject本身或其继承者。但是根据多态性,它的继承者也可以看作是SomeObject,因此它也可以工作:
List<SomeObject> l;
那么,为什么在第二个选项定义明确且基本相同时,有人会使用第一个选项呢?
List<SomeObject> l;
在这种情况下,您不能说List<SomeObject> l = new ArrayList<SubClassOfSomeObjectClass>;
(
不允许 )在哪里
List<? extends SomeObject> l;
你可以说
List<? extends SomeObject> l = new ArrayList<SubClassOfSomeObject>;
( 允许
)
但是请注意,List<? extends SomeObject> l = new ArrayList<SubClassOfSomeObject>;
您
不能在列表中添加任何内容, 因为?代表未知课程( 课程为null除外 )。
更新: 您在评论中的问题What could I possibly do with a list if I cannot add anything to it?
现在考虑一种情况,在这种情况下,您必须编写一个函数来打印列表,但请 注意,它必须只接受包含对象的List,该对象是SomeObject的子类
。如上所述,在这种情况下,您将无法使用
public void printList(List<SubClassOfSomeObjectClass> someList)
那你会怎么做?你会做类似的事情
public void printList(List<? extends SomeObject> someList) {
for(SomeObject myObj : someList) {
//process read operations on myObj
}
我们已经看到,IPv6 可以简化一些功能,比如全球地址寻址、主机地址的自动配置等。由于 IPv6 提供的地址总数能满足我们今后几百年甚至上千年的需求,我们可以为所能想到的几乎所有物体都分配一个全球唯一的 IPv6 地址。这也是因特网规范的初衷 —— 每一个 IP 设备间都可以相互通信。这种端对端的通信允许整个因特网或者任何 IP 设备都可以双向通信,这将促进产生新的应用,新的存储、发送、接收和访问
问题内容: 我刚刚发现它已被弃用,这使我在Google上可以找到的有关如何使用客户端的所有信息失效。在Javadoc中没有给出指示,以什么来代替使用。Google同样保持沉默。 我现在已经回复,但是无论如何都会对答案感兴趣,以及人们应该如何找到答案而又不问其他知道的人?我是否可以找到该信息的资源? 问题答案: 3.0测试文档这里介绍,像这样这些弃用: Resteasy手动客户端API,拦截器,St
本文向大家介绍为什么在Bash中应该避免eval,我应该用什么来代替呢?,包括了为什么在Bash中应该避免eval,我应该用什么来代替呢?的使用技巧和注意事项,需要的朋友参考一下 eval是Bash shell的内置命令,它将其参数连接为单个字符串。然后,它将参数与空格连接起来,然后将该字符串作为bash命令执行。以下是其工作方式的示例。 eval示例 在下面的示例中,我们使用一个字符串,该字符串
在Kotlin文档中,我们只有以下几个字。 只读局部变量使用val关键字声明。可变局部变量使用var关键字声明。 这个问题不仅是让我们理解单词的意思,也是提醒单词制造者告诉我们他们为什么给这个单词命名,这不是一件小事,这会让我们更舒服地学习新知识,我们想学习和理解一切。
问题内容: 看看这个: 我运行了一个快速的Google搜索,但找不到答案- 我应该用什么代替? 问题答案: 由于django 1.7 引入的迁移系统而被弃用。 现在,您可以使用 跟踪 更改。这会将您的模型更改转换为python代码,以使其可部署到另一个数据库。当您需要对数据库进行进一步的修改时,可以使用数据迁移。 创建迁移后,您必须 应用 它们:。 因此,除了使用之外,您还应该使用然后。 更改模型
问题内容: 看看这个: 问题答案: 由于django 1.7引入的迁移系统而被弃用。 现在,你可以使用跟踪更改。这会将你的模型更改转换为python代码,以使其可部署到另一个数据库。当你需要对数据库进行进一步的修改时,可以使用数据迁移。 创建迁移后,你必须应用它们:。 因此,除了使用之外,你还应该使用然后。 更改模型中的某些内容后,开发工作流程如下: 在你的生产系统上: 奖励:你无需migrate