栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java泛型编程(java泛型类的定义和使用)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java泛型编程(java泛型类的定义和使用)

前言

在JDK1.5之后出现了泛型这个概念,在介绍泛型之前,不妨想想为什么会有泛型这个东西?

例如在泛型出现之前,使用List是这样的

List list = new ArrayList();

我可以往这个list中放任何类型的东西,多方便!你是方便了,但是开发者就难受了,对每个元素都要记得转换类型,不然哪里知道这里面放的什么鬼东西,如果限定某个List只能放某种类型不就好了嘛

所以Java参考了C++模板类的概念,定义一个模板类

public class ArrayList implements List{
}

T可以是任何类型,这样编译器通过用户传入的类型,确定这个List到底是用来放什么的

泛型的实现

泛型实现分为膨胀法和擦除法

膨胀法:如果传入的是Integer,那就生成一个List_Integer类,其他类型也一次类推,这个方法的问题就出现在这样干类实在是太多了擦除法:Java里面实际就用的这个方法,用户传入一个T,但是实际Java会擦除这个T,也就是List中存的还是原始的Object对象,当用户去list.get(i)获取对象的时候,自动按照之前传入的T给他做一次转化,例如传入的T是Integer:

Integer i =( Integer )list.get(0)

Java泛型就这么实现了!

泛型和继承

有时候我们为了符合一些特殊情况,例如排序

泛型还要实现Comparable接口,才能比较大小

所以使用extend关键字,使得传入的类型是Comparable的子类:

 >

我们知道,Java中有多态这个概念,例如水果类Fruit和橘子类Orange,讲道理我们设定方法

public void functionA(Fruit f){
}

传Orange照样是可以传进去的

但是如果按照上面的泛型实现,传的是ArrayList,针对下面的方法,就不太行了

public void functionA(ArrayList f){
}

因为Fruit是Orange父类,但是ArrayList可不是ArrayList父类

所以Java引入了通配符的概念来使得泛型和继承兼容:

例如ArrayList中的addAll方法,这里就使用?extend来兼容Java的多态继承,?就是通配符

public boolean addAll(Collection c) {
    return addAll(this.size, c);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/776563.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号