|
|
1
356
以上所有内容。
从本质上讲,这些术语描述了子类型关系如何受到类型转换的影响。也就是说,如果
让我们考虑一个例子。允许
是
另一个例子。允许
这仍然相当抽象。为了更具体,让我们看看Java中的哪些操作是根据子类型关系定义的。最简单的例子是赋值。声明
将仅在以下情况下编译
不会用Java编译,但是
将 子类型关系很重要的另一个示例是方法调用表达式:
非正式地说,这句话是通过赋值来评估的
以下任何表达式都不会编译:
但是
将 另一个重要的子类型是压倒一切的例子。考虑:
哪里
非正式地,运行时会将其重写为:
对于要编译的标记行,重写方法的方法参数必须是被重写方法方法参数的超类型,返回类型必须是被覆盖方法的子类型。从形式上讲,
注意上面的“至少”。这些是任何合理的静态类型安全的面向对象编程语言都会强制执行的最低要求,但编程语言可能会选择更严格的要求。在Java 1.4的情况下,重写方法时,参数类型和方法返回类型必须相同(类型擦除除外),即。
我希望我涵盖了一切——或者更确切地说,触及了表面。尽管如此,我还是希望这将有助于理解类型方差这一抽象但重要的概念。 |
|
|
2
28
方差是关于具有不同泛型参数的类之间的关系。他们的关系是我们能够铸造他们的原因。 Co和Contra方差是非常合乎逻辑的东西。语言类型系统迫使我们支持现实生活中的逻辑。举个例子很容易理解。 协方差例如,你想买一朵花,而你所在的城市有两家花店:玫瑰店和雏菊店。
如果你问某人“花店在哪里?”有人告诉玫瑰店在哪里,可以吗?是的,因为玫瑰是一朵花,如果你想买一朵花,你可以买一朵玫瑰。如果有人回复你菊花店的地址,也是如此。
这是一个例子
协方差
:您可以铸造
类型:
问题是“花店在哪里?”,答案是“玫瑰店在那里”:
抵销
例如,你想把花送给你的女朋友。如果你的女朋友喜欢任何一朵花,你能认为她是一个喜欢玫瑰的人,还是一个喜欢雏菊的人?是的,因为如果她喜欢任何一朵花,她都会喜欢玫瑰和雏菊。
这是
反方差
:你可以选
类型:
你把喜欢任何花的女朋友视为喜欢玫瑰的人,并送给她一朵玫瑰:
您可以在 Source 。 |
|
3
13
采用java类型的系统,然后类: 任何T类型的对象都可以用T的子类型的对象代替。 类型方差-类方法具有以下结果
可以看出:
现在,共型和反型都与B是A的亚型有关。以下更强的打字法可以用更具体的知识来介绍。在子类型中。 协方差(在Java中可用)是有用的,可以说在子类型中返回更具体的结果;尤其是当A=T和B=S时。 相反,你已经准备好处理一个更一般的论点了。 |