学习Java之对对象声明类型的转型的一点点感觉

昨天,我写程序的时候,编译时,编译器报了一个错误:Object类型不能赋予String类型变量。

程序如下:

Iterator iterator = myList.iterator();
while(iterator.hasNext()) {
    //String str = itrator.next();//错误,没有强制转为子类型声明
    String str = iterator.next();//正确
}

我们知道Iterator的next()方法返回Object类型对象。在这里,我明显犯了一个很低级的错误——把父类型声明变量标识的对象没有强制转型为子类型声明来标识。

在我们所有看的书中,都把转型叫做对对象的转型,这么称呼这个操作过程,很容易让我误解是对象的实例的类在JRE中发生了变化,是对像的本质发生了变化,这就是这种称呼对我造成的误解和误导。

但现在就以上面的代码,让我讲讲书上说的对象的转型在JVM中发生了什么变化——这里要显示转型的原因:因为next()返回Object类型的结果,现在要把Object类型的(隐式的)引用变量的值赋予String类型,因为Java是强类型语言,所以就要重新声明为String类型。那么,JVM对对象的描述信息就要与Object类型声明时不同,由于其heap中的实例(对象)满足引用变量的声明类型转换的条件,因它是用String类模板来创建的对象,即可以从实例的类描述中获得要转换到的声明类型的信息,因此可以做此对象的声明类型的转换。

这个例子中,是由Object转为String,是从类的上层变为类的下层,是属于窄化转换,如图:

类层次

因Java中类型的窄化转换使对象的适用性变小,对象的限制就会变多,为了保证程序的精确性,就需要强制转型。

由此错误,让我对对象类型的转换有了以上的思索,那就是让我对以前我一直以为的对象的转型有了一个更深的认知,是对象的转型实质是引用声明变量的转型,而不是heap中的对象发生了变化,若说变化,那就是对对象的描述信息由原来声明的类型变为了被转型的类型描述,这便是塞翁失马焉知非福。

猜你喜欢

转载自blog.csdn.net/Anglebeat/article/details/83451537
今日推荐