Java泛型机制和向上转型

目录

参数化类型

向上转型


1.参数化类型

在Java SE5出现之前,容器存储的对象都只具有Java中的通用类型:Object。单根继承结构意味着所有东西都是Object类型,所以可以存储Object的容器可以存储任何东西°。这使得容器很容易被复用。
要使用这样的容器,只需在其中置入对象引用,稍后还可以将它们取回。但是由于容器只存储Object,所以当将对象引用置入容器时,它必须被向上转型为0bject,因此它会丢失其身份。当把它取回时,就获取了一个对Object对象的引用,而不是对置入时的那个类型的对象的引用。所以,怎样才能将它变回先前置入容器中时的具有实用接口的对象呢?
这里再度用到了转型,但这一次不是向继承结构的上层转型为一个更泛化的类型,而是向下转型为更具体的类型。这种转型的方式称为向下转型。

Circle是一种Shape类型:但是不知道某个Object是Circle还是Shape,所以除非确切知道所要处理的对象的类型,否则向下转型几乎是不安全的。
然而向下转型并非彻底是危险的,因为如果向下转型为错误的类型,就会得到被称为异常的运行时错误,稍后会介绍什么是异常。尽管如此,当从容器中取出对象引用时,还是必须要以某种方式记住这些对象究竟是什么类型,这样才能执行正确的向下转型。?
向下转型和运行时的检查需要额外的程序运行时间,也需要程序员付出更多的心血。那么创建这样的容器,它知道自己所保存的对象的类型,从而不需要向下转型以及消除犯错误的可能,这样不是更有意义吗?这种解决方案被称为参数化类型机制。参数化类型就是一个编译器可以自动定制作用于特定类型上的类。在Java中它称为范型。一对尖括号,中间包含类型信息,通过这些特征就可以识别对范型的使用。例如,可以用下面这样的语句来创一个存储Shape的ArrayList:


ArrayList<Shape> shapes = new Arraylist<Shape>():

虽然他们不能持有基本数据类型,但是JavaSE5的自动包装使得这项限制几乎不成问题。

2.向上转型


“为新的类提供方法”并不是继承技术中最重要的方面,其最重要的方面是用来表现新类和
基类之间的关系。这种关系可以用“新类是现有类的一种类型”这句话加以概括。


这直接是由语言所支撑的。例如,假设有一个称为Instrument的代表乐器的基类和一个称为Wind的导出类。由于继承可以确保基类中所有的方法在导出类中也同样有效,所以能够向基类发送的所有信息同样也可以向导出类发送。如果Instrument类具有一个play方法,那么Wind乐器也将同样具备。这意味着我们可以准确地说Wind对象也是一种类型的Instrumer

下面这个例子说明了编译器是怎样支持这一概念的:
class Instrument{
public void play();
static void tune(Instrument i){

         i .play();

        }

}
public class Wind extends Instrument {

        public static void main(String[] args){
                Wind flute = new Wind();
                Instrument. tune(flute);
        }

}


在此例中,tune方法可以接受Instrument引用,这实在太有趣了。但在Wind.main0中,传递给tune方法的是一个Wind 引用。

鉴于Java对类型的检查十分严格,接受某种类型的方法同样可以接受另外一种类型就会显得很奇怪,除非你认识到Wind对象同样也是一种Instrument对象,而且也不存在任何tune0方法是可以通过Instrument来调用,同时又不存在于Wind之中。在tune中,程序代码可以对Instrument和它所有的导出类起作用,这种将Wind引用转换为Instrument 引用的动作,我们称之为向上转型。

导出类转型成基类,在继承图上是向上移动的,因此一般称为向上转型。由于向上转型是从一个较专用类型向较通用类型转换,所以总是很安全的。也就是说,导出类是基类的一个超集。它可能比基类含有更多的方法,但它必须至少具备基类中所含有的方法。在向上转型的过程中,类接口中
唯一可能发生的事情是丢失方法,而不是获取它们。这就是为什么编译器在“未曾明确表示转型”
或“未曾指定特殊标记”的情况下,仍然允许向上转型的原因(不用至少比被乱用更好)。
也可以执行与向上转型相反的向下转型,但其中含有一个难题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拥抱白熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值