java 实现协方差_Java Language

博客探讨了Java中数组的协变特性,即Integer[]是Number[]的子类,但这种协变可能导致意外的ArrayStoreException。文章通过示例说明了数组赋值的潜在风险,并指出使用泛型List可以避免此类问题。同时,文章还展示了不同类型的数组元素如何共存,以及创建和初始化数组的各种方式。
摘要由CSDN通过智能技术生成

对象数组是协变的,这意味着就像Integer是Number的子类一样, Integer[]是Number[]的子类。这可能看起来很直观,但可能导致令人惊讶的行为:Integer[] integerArray = {1, 2, 3};

Number[] numberArray = integerArray; // valid

Number firstElement = numberArray[0]; // valid

numberArray[0] = 4L; // throws ArrayStoreException at runtime

尽管Integer[]是Number[]的子类,但它只能保存Integer ,并且尝试分配Long元素会抛出运行时异常。

请注意,此行为对于数组是唯一的,可以通过使用通用List来避免:List integerList = Arrays.asList(1, 2, 3);

//List numberList = integerList; // compile error

List extends Number> numberList = integerList;

Number firstElement = numberList.get(0);

//numberList.set(0, 4L); // compile error

所有数组元素都不必共享相同的类型,只要它们是数组类型的子类:interface I {}

class A implements I {}

class B implements I {}

class C implements I {}

I[] array10 = new I[] { new A(), new B(), new C() }; // Create an array with new

// operator and array initializer.

I[] array11 = { new A(), new B(), new C() }; // Shortcut syntax with array

// initializer.

I[] array12 = new I[3]; // { null, null, null }

I[] array13 = new A[] { new A(), new A() }; // Works because A implements I.

Object[] array14 = new Object[] { "Hello, World!", 3.14159, 42 }; // Create an array with

// new operator and array initializer.

Object[] array15 = { new A(), 64, "My String" }; // Shortcut syntax

// with array initializer.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值