Java泛型:泛型的定义(类、接口、对象)、使用、继承

1. 设计泛型的初衷:

1) 主要是为了解决Java容器无法记忆元素类型的问题:

i. 由于Java设计之初并不知道会往容器中存放什么类型的元素,因此元素类型都设定为Object,这样就什么东西都能放了!

ii. 但是这样设计有明显的缺点:

a. 取出元素的时候必须进行强制类型转换(尽管集合在运行时里面元素的“运行时类型”不变,即元素的getClass返回的还是最初自己的类型而不是Object);

b. 如果不小心往集合里加了不相同类型的元素可能会导致类型异常(进行equals、compare比较的时候尤为明显);

c. 由于没有类型就需要在很多地方进行强制类型转换,但是这样做增加了编程的复杂度,并且代码也不美观(臃肿),维护起来也更加困难;

2) 泛型的概念定义:

i. 从Java 5开始,引入了参数化类型(Parameterized Type)的概念,改造了所有的Java集合,使之都实现泛型,允许程序在创建集合时就可以指定集合元素的类型,比如List<String>就表名这是一个只能存放String类型的List;

ii. 泛型(Generic):就是指参数化类型,上面的List<String>就是参数化类型,因此就是泛型,而String就是该List<String>泛型的类型参数;

3) 泛型的好处:

i. 使集合可以记住元素类型,即取出元素的时候无需进行强制类型转化了,可以直接用原类型的引用接收;

ii. 一旦指定了性参数那么集合中元素的类型就确定了,不能添加其他类型的元素,否则会直接编译保存,这就可以避免了“不小心放入其他类型元素”的可能;

iii. 上述保证了如果在编译时没有发出警告,则在运行时就一定不会产生类型转化异常(ClassCastException);

iv. 显然,泛型使编程更加通用,并且代码也更加简洁,代码更加容易维护;

2. 创建泛型对象——自动类型推断的菱形语法:

1) 首先,定义泛型引用一定要使用尖括号指定类型参数,例如:List<String> list、Map<String, Integer>等,其中的String、Integer之类的就是类型参数;

2) 其次,使用构造器构造泛型对象的时候可以指定类型参数也可以不指定,例如:

 i. List<String> list = new List<String>();  // 这当然是对的

       ii. List<String> list = new List<>();  // 这样对,因为List的类型参数可以从引用推断出!

!!但是引用的类型参数是一定要加的,否则无法推断;

3) 由于<>很像菱形,因此上面的语法也叫做菱形语法;

4) 错误提示:引用无类型参数但构造器有类型参数的写法是不对的!例如,List list = new List<String>();

!!至于为什么不对,这会在泛型原理的章节中详细介绍,这里先记住这样写不对就行了!

!反正就是一个原则,泛型引用是一定要指定类型参数的!!

5) 示例:

[java]  

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzssgd.html