Java 核心技术之泛型详解

本文导读

什么是泛型?我们在工程代码中一定看过 T,K,V 等等,这个就是泛型了,那我们看看官网是怎么说的这个 @泛型(Generic)

When you take an element out of a  Collection , you must cast it to the type of element that is stored in the collection. Besides being inconvenient, this is unsafe. The compiler does not check that your cast is the same as the collection's type, so the cast can fail at run time.

Generics provides a way for you to communicate the type of a collection to the compiler, so that it can be checked. Once the compiler knows the element type of the collection, the compiler can check that you have used the collection consistently and can insert the correct casts on values being taken out of the collection.

官方这话是什么意思呢:当你从集合中取出元素时,必须将其强制转换为存储在集合中的元素类型。除了不方便,这是不安全的。编译器不会检查强制转换是否与集合的类型相同,因此强制转换可能会在运行时失败。

泛型提供了一种将集合的类型传递给编译器的方法,以便可以对其进行检查。一旦编译器知道集合的元素类型,编译器就可以检查您是否一致地使用了集合,并且可以对从集合中取出的值插入正确的强制转换。

官方这段晦涩的语言什么意思呢?总之就是一句话:泛型程序设计(Generic programming)意味着编写的代码可以被很多不同类型的对象所重用。

一、什么是泛型

Java 泛型(Generic)是 J2SE1.5 中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

了解泛型概念之后的学习的目标是什么呢?

一、了解泛型的规则与类型擦除

二、了解类型和限制两种泛型的通配符

三、了解在 API 设计时使用泛型的方式(自定义泛型类、泛型接口、泛型方法)

四、掌握泛型的使用及原理。

五、掌握泛型在中间件或者开源框架里的应用

下面我们对这几个问题一一探讨

二、泛型的规则

JDK5.0 之前是没有泛型这个概念的,那么当时是怎么写代码的

import java.io.File;import java.util.ArrayList;/** * @author mac * @date 2020/10/31-11:05 */public static void main(String[] args) {
     ArrayList arrayList = new ArrayList();   arrayList.add(1);   arrayList.add("a");   // 这里没有错误检查。可以向数组列表中添加任何类的对象   arrayList.add(new File("/"));   // 对于这个调用,如果将get的结果强制类型转换为String类型,就会产生一个错误   // Exception in thread "main" java.lang.ClassCastException: java.io.File cannot be cast to java.lang.String   String file = (String) arrayList.get(2);   System.out.println(file);}

复制代码

在 JDK5.0 以前,如果一个方法返回值是 Object,一个集合里装的是 Object,那么获取返回值或元素只能强转,如果有类型转换错误,在编译器无法觉察,这就大大加大程序的错误几率!

public static void main(String[] args) {
      ArrayList<String> arrayList = new ArrayList<String>();    arrayList.add("a");    String s = (String) arrayList.get(0);    // 6、7行代码编译不通过,不会导致运行后才发生错误    arrayList.add(1);    arrayList.add(new File("/"));    String file = (String) arrayList.get(2);}

复制代码

从泛型的使用可以看出,泛型是一种类型约束,简而言之,泛型在定义类,接口和方法时使类型(类和接口)成为参数。与方法声明中使用的更熟悉的形式参数非常相似,类型参数为您提供了一种使用不同输入重复使用相同代码的方法。区别在于形式参数的输入是值,而类型参数的输入是类型。

JDK 是在编译期对类型进行检查,提供了编译时类型的安全性。它为集合框架增加了编译时类型的安全性,并消除了繁重的类型转换工作。

public class Person {
      int gender;}public class Driver extends Person {
      String name;    int skilllevel;}public static void main(String[] ars) {
     List<Person> ls = new Arraylist<>();   //这里会不会编译报错?   List<Driver> list = ls;}

复制代码

然而泛型的应用也不是没有坑,比如上述代码,可以看出编译报错,这是不允许子类型化的泛型规则——假设允许,那么是不是可以改成以下的情况,在 JDK 里所有的类都是 Object 的子类,如果允许子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值