1、数组的协变性
数组的协变性(covariant)是指:
如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。
而泛型是不可变的(invariant),List不会是List的基类,更不会是它的子类。
数组的协变性可能会导致一些错误,比如下面的代码:
1
2
3
4
|
public static void main(String[] args) {
Object[] array = new String[ 10 ];
array[ 0 ] = 10 ;
} |
它是可以编译通过的,因为数组是协变的,Object[]类型的引用可以指向一个String[]类型的对象
但是运行的时候是会报出如下异常的:
1
|
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer
|
但是对于泛型就不会出现这种情况了:
1
2
3
4
|
public static void main(String[] args) {
List< Object> list = new ArrayList< String>();
list.add( 10 );
} |
这段代码连编译都不能通过。
2、数组的具体化。
数组是具体化的(reified),而泛型在运行时是被擦除的(erasure)。
数组是在运行时才去判断数组元素的类型约束,
而泛型正好相反,在运行时,泛型的类型信息是会被擦除的,只有编译的时候才会对类型进行强化。
所以上面的例子中,数组的方法会在运行时报出ArrayStoreException,而泛型根本无法通过编译。
3、泛型不是协变的
虽然将集合看作是数组的抽象会有所帮助,但是数组还有一些集合不具备的特殊性质。
Java 语言中的数组是协变的(covariant),也就是说,如果 Integer扩展了 Number(事实也是如此),那么不仅 Integer是 Number,而且 Integer[]也是 Number[],在要求 Number[]的地方完全可以传递或者赋予 Integer[]。(更正式地说,如果 Number是 Integer的超类型,那么 Number[]也是 Integer[]的超类型)。
您也许认为这一原理同样适用于泛型类型 —— List是 List的超类型,那么可以在需要 List的地方传递 List。不幸的是,情况并非如此。
不允许这样做有一个很充分的理由:
这样做将破坏要提供的类型安全泛型。
如果能够将 List赋给 List。
那么下面的代码就允许将非 Integer的内容放入 List
1
2
3
|
List<integer> li = new ArrayList<integer>();
List<number> ln = li; // illegal
ln.add( new Float( 3.1415 ));</number></integer></integer>
|
因为 ln是 List,所以向其添加 Float似乎是完全合法的。但是如果 ln是 li的别名,那么这就破坏了蕴含在 li定义中的类型安全承诺 —— 它是一个整数列表,这就是泛型类型不能协变的原因。
相关推荐
测试源码 博文链接:https://invocationhandler.iteye.com/blog/1593609
COVARIANT COMPOSITIONAL NETWORKS FOR LEARNING GRAPHS.pdf
协变返回类型和智能指针 协变返回类型是一种语言功能,它允许您将虚函数的返回类型更改为协变类型,即。 指向派生类的指针而不是指向基类的指针 - 请参见下面的示例: struct Figure { virtual ~Figure () = ...
资料内容:牛津大学经典图像匹配评估数据集、Affine Covariant Regions Datasets、数据集文件内容主要包含Bikes(模糊变化)、Trees(模糊变化)、Graffiti(视角变化)、Wall(视角变化)、Leuven(光照变化)、UBC...
多态(polymorphism) “多态”理解 再论向上转型 多态内部机制 正确使用,私有、静态方法及域与多态关系 构造器-多态 协变的返回类型(Covariant return types) 用继承进行设计(纯继承与扩展、向下转型)
主要介绍了详解.NET 4.0中的泛型协变(covariant)和反变(contravariant),本文讲解了协变和反变的背景知识、.NET 4.0引入的泛型协变、反变性、协变和反变的相互作用等内容,需要的朋友可以参考下
求解图像的特征值,改特征值具有很强的可靠性,affine covariant features,并将此特征值转换为大家熟悉的sift形式
Covariant Script 编程语言是一种开源、开放的动态强类型通用编程语言,在数据分析、可视化、系统软件方面均有一定的应用
js代码-[CONFIDENTIAL] Covariant Interview Question: Functional Exercise (Javascript)
matlab特征点代码学习判别和变换协变局部特征检测器 该代码是我们CVPR 2017论文的培训和评估代码。 它包括翻译协变局部特征检测器的实现。 仿射协方差模型将在将来添加。 @inproceedings {zhang2017learning,标题= ...
Covariant Script 编程语言是一种开源、开放的动态强类型通用编程语言,在数据分析、可视化、系统软件方面均有一定的应用
Cats——范畴论风格的特征 放弃希望所有进入这里的人。 猫会开始无耻,我们会看看会发生什么。 (我这样做完全是为了避免创建一个名为Covariant的签名。) 目标和想法 签名,而不是类型类,像这些基本上是 Haskell ...
1. 类型 2. 语法 4. 解释器 1. 类型 2. 语法
Array initialization ............. 133 Variable argument lists ............. 137 Enumerated types ............... 141 Summary ............................ 143 Access Control 145 package: the library ...
基于协变密度泛函理论对核物质对称能的同位旋耦合道分解,赵前,孙保元,基于协变密度泛函理论,对势能密度泛函进行同位旋耦合道分解,研究了其随同位旋与密度的依赖性质以及对与核物质对称能的相关影响。�
Covariant_Compositional_Networks_Tf2 该存储库包含Tensorflow 2中协变成分网络的实现,用于对最初介绍它们的论文进行复制研究。 我们基于的原始论文可以在找到。 Python版本:3.6.7 要安装依赖项,请创建新的...
协变脚本编程语言:解释器 欢迎使用Covariant Script编程语言! Covariant Script是一种开放源代码,跨平台的编程语言。 该项目是官方维护的协变脚本解释器。 切换语言 特征 跨平台,支持大多数主流操作系统 与旧版...
It now has comprehensive support for Java annotations, along with support for other language improvements such as generics, variable-length argument lists, and covariant return types.