Object数组

1. 数组的协变性

  正常来说,相比于泛型,数组类型是一种协变类型,即如果类S是类F的子类,那么,S[]类型的数组是F[]类型数组的子类,也即从类型S[]转换到F[]是隐式转换的,那么由于Object是所有类型的父类,因此任何数组转换到Object数组都是一定成功的。
  关于Object数组转换到String数组有一个地方需要注意:

2. Object数组与String数组的转换

测试代码块2-1

	Object[] string={"hehe","lii"};
	String[] strings=(String[])string;

  运行时会报错:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

  下面来测试一下通过{" str1",“str2”}创建的到底是一个String数组还是一个Object数组,因为如果创建的是一个String数组,那么string引用实际上指向的是一个String数组,那么强制转换肯定是会成功的。

测试代码块2-2

	Object[] string={"hehe","simida"};
	if(string instanceof String[])
	{
		out.println("string实际上是字符串数组类型");
	}
	else
	{
		out.println("string实际上是Object数组类型");
	}

输出:

string实际上是Object数组类型

  可以看出通过{" str1",“str2”}创建的是一个Object数组,但是Object数组中的每一个元素都实际上指向了一个String对象。这可以通过以下代码来进行验证:

测试代码块2-3

	Object[] string={"hehe","simida"};
	for(int i=0;i<string.length;i++)
	{
		String string1=(String)string[i];
		out.println(string1);
	}

输出:

hehe
simida

  但是这种数组还是一个Object数组,不是一个String数组。
  而如果通过以下方式创建Object数组,转换不会出错。

测试代码块2-4

	Object[] string=new String[]{"hehe","lii"};
    if(string instanceof String[])
    {
        out.println("string实际上是字符串数组类型");
    }
    else
    {
        out.println("string实际上是Object数组类型");
    }
    String[] strings=(String[])string;

输出:

out.println(“string实际上是字符串数组类型”);

  因为new String[] 方式创建的就是一个字符串数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值