Java泛型

一、什么是泛型

Java 泛型( generics) 是 JDK 5 中引⼊的⼀个新特性, 允许在定义类和接⼜的

时候使⽤类型参数,泛型最⼤的好处是可以提⾼代码的复⽤性。

二、java处理泛型的发方式

虚拟机中没有泛型,只有普通类和普通方法,所有泛型类的类型参数在编译时都会被 擦除,泛型类并没有自己独有的 Class 类对象。比如并不存在 List<String>.class 或是List<Integer>.class,而只有 List.class

Code sharing :对每个泛型类只生成唯一的一份目标代码;该泛型类的所有实例 都映射到这份目标代码上,在需要的时候执行类型检查和类型转换 。

Java 编译器通过 Code sharing 方式为每个泛型类型创建唯一的字节码表示,并且将 该泛型类型的实例都映射到这个唯一的字节码表示上。将多种泛型类形实例映射到唯一的字 节码表示是通过类型擦除(type erasue)实现的 。 Java 语言中的泛型只在程序源码中存在,在编译后的字节 码文件中,就已经被替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相 应的地方插入了强制转型代码,因此对于运行期的 Java 语言来说,ArrayList与ArrayList就是同一个类。所以说泛型技术实际上是 Java 语言的一颗语法糖,Java 语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型被称为伪泛型

三、泛型使用范围

可以用在类、接口、方法上

类:public class Message<T>

接口:public interface Message<T>

方法:

四、泛型带来的问题

1.重载问题:观察下面代码

上面这段代码,有两个重载的函数,因为他们的参数类型不同,一个是 List另一个是 List ,但是,这段代码是编译通不过的。因为我们前面讲过,参数List和 List编译之后都被擦除了,变成了一样的原生类型 List,擦除动作导致这两个方法的特征签名变得一模一样。

2.当泛型内包含静态变量

答案是——2!由于经过类型擦除,所有的泛型类实例都关联到同一份字节码上,泛型类的所有静态变量是共享的

五、泛型通配符

泛型中 K T V E ? object 等的含义 E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ? - 表示不确定的 java 类型(无限制通配符类型) S、U、V - 2nd、3rd、4th types

示例:fun()中使用?就可以接受不确定java类型,其中信息也不会被修改

上下界限定符<? extends T>和<? super T>

<? extends Number>:是指 “上界通配符(Upper Bounds Wildcards)”,即泛型中 的类必须为当前类的子类或当前类

示例:

<? super String>:是指 “下界通配符(Lower Bounds Wildcards)”,即泛型中的 类必须为当前类或者其父类

示例:

六、常见问题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值