|
|
1
47
假设您创建了一个 狗 . 然后你声明这是 列表<动物> 把它交给同事。他, 不合理 ,相信他可以 猫 在里面。 然后他把它还给你,你现在有一个清单 狗 ,用 猫 在中间。混乱接踵而至。 需要注意的是,由于列表的易变性,这个限制是存在的。例如,在scala中,可以声明 狗 是一个列表 动物 . 这是因为scala列表(默认情况下)是不可变的,因此添加 猫 一份清单 狗 会给你一个 新的 名单 动物 . |
|
|
2
8
你要找的答案是关于协方差和反方差的概念。有些语言支持这些功能(例如,net 4增加了对这些功能的支持),但是一些基本问题可以通过如下代码来说明:
因为猫是从动物身上派生出来的,所以编译时检查会建议将其添加到列表中。但是,在运行时,不能将猫添加到狗的列表中! 所以,虽然看起来直观上很简单,但这些问题实际上是非常复杂的。 下面是.net 4中co/contrance的msdn概述: http://msdn.microsoft.com/en-us/library/dd799517(VS.100).aspx 这也适用于Java,虽然我不知道Java的支持是什么样的。 |
|
|
3
8
我能给出的最好的回答是: 因为在设计泛型时,他们不想重复对Java的数组类型系统做出的不安全的决定。 . 这在数组中是可能的:
这段代码编译得很好
因为数组的类型系统在Java中工作。它会引起
决定不允许泛型出现这种不安全的行为。 另见: Java Arrays Break Type Safety ,许多人认为 Java Design Flaws . |
|
|
4
5
你要做的是:
这应该管用。 |
|
5
4
一 列表<动物> 是可以插入任何动物(例如猫或章鱼)的对象。安 阵列列表<狗> 不是。 |
|
|
6
4
我想说最简单的答案是忽略猫和狗,它们是不相关的。重要的是名单本身。
和
是不同的类型,那只狗是从动物身上衍生出来的,与此毫无关系。 此语句无效
因为同样的原因这个是
虽然dog可以从animal继承,但是
不是从由
假设因为两个类是相关的,所以将它们用作泛型参数会使这些泛型类也相关,这是错误的。你当然可以在
这并不意味着
是
|
|
7
3
假设你
能够
这样做。有人交给我的东西之一
|
|
|
8
2
注意如果你有
如果你能的话
这确实
不
转
|
|
|
9
2
首先,让我们来定义我们的动物王国:
考虑两个参数化接口:
以及实现这些
在这种情况下,你的要求是很合理的
那么为什么Java不自动执行这个操作呢?想想这意味着什么
如果Java自动允许
那么
有时类型参数在两个位置都使用,使接口 不变量 .
出于向后兼容性的原因,Java默认值为
不变性
. 必须显式选择与
这真是个麻烦——每次有人使用A泛型类型时,他们都必须做出这个决定!当然是
这称为“声明站点差异”,在scala中可用。
|
|
|
10
2
如果你不能改变列表,那么你的推理就完全正确了。不幸的是
如果
这是一个更普遍的例子 Liskov substitution principal .
基因突变导致的问题在别处也会发生。考虑类型
是一个
你可以定义
你甚至可以添加计算
你可以定义一个
但是当你开始允许通过
现在,
你不能用你的
你可以用一种新方法
类似地
|
|
|
11
1
这是因为泛型类型是 invariant . |
|
|
12
0
英文答案:
如果
编程答案: 类型安全一种保守的语言默认设计选择,可阻止此损坏:
为了有一个子类型关系,必须使用“castability/“subsitability”标准。
然而
根据泛型类的设计,类型参数可以在“安全位置”中使用,这意味着强制转换/替换有时可以成功,而不会破坏类型安全性。协方差意味着一般的重复
使用这两个习惯用法需要开发人员付出额外的努力和注意,以获得“可替代性能力”。Java需要手动开发人员努力确保类型参数在共变/逆变位中真正使用(因此类型安全)。我不知道为什么-例如scala编译器会检查这个:-/。你基本上是在告诉编译器‘相信我,我知道我在做什么,这是类型安全的’。
|
|
|
13
-1
通过继承,实际上是为几个类创建公共类型。这里有一种常见的动物类型。通过在动物类型中创建数组并保留类似类型(继承类型狗、猫等)的值,可以使用它。 如:
…… 知道了? |
|
|
matt · 为什么在使用泛型参数时可以进行强制转换,而在指定了参数后则不能 11 月前 |
|
|
Pavel Foltyn · 如何在C中生成逆字典# 1 年前 |
|
Daniel · C#编译器在应该出错时失败 1 年前 |