网站首页 > java教程 正文
泛型大家都接触的不少,但是由于Java 历史的原因,Java 中的泛型一直被称为伪泛型,因此对Java中的泛型,有很多不注意就会遇到的“坑”,在这里详细讨论一下。
一、什么是泛型?
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数的方式传递,类似于方法中的变量参数。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。
那么参数化类型怎么理解呢?
顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(类型形参),然后在使用/调用时传入具体的类型(类型实参)。
这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
二、为什么要使用泛型?
使用泛型能写出更加灵活通用的代码:泛型的设计主要参照了C++的模板,旨在能让人写出更加通用化,更加灵活的代码。模板/泛型代码,就好像做雕塑时的模板,有了模板,需要生产的时候就只管向里面注入具体的材料就行,不同的材料可以产生不同的效果,这便是泛型最初的设计宗旨。
泛型将代码安全性检查提前到编译期:泛型被加入Java语法中,还有一个最大的原因:解决容器的类型安全,使用泛型后,能让编译器在编译的时候借助传入的类型参数检查对容器的插入,获取操作是否合法,从而将运行时转移到编译时,只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常,这样程序就能更加健壮!
三、泛型的使用
泛型有三种常用的使用方式:泛型接口,泛型类和泛型方法。
(1)泛型接口
泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中,可以看一个例子:
//定义一个泛型接口
public interface Generator<T> {
public T next();
}
当实现泛型接口的类,未传入泛型实参时:
/**
* 未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中
* 即:class AnimalGenerator<T> implements Generator<T>{
* 如果不声明泛型,如:class AnimalGenerator implements Generator<T>,编译器会报错:"Unknown class"
*/
class AnimalGenerator<T> implements Generator<T>{
@Override
public T next() {
return null;
}
}
当实现泛型接口的类,传入泛型实参时:
/**
* 传入泛型实参时:
* 定义一个生产器实现这个接口,虽然我们只创建了一个泛型接口Generator<T>
* 但是我们可以为T传入无数个实参,形成无数种类型的Generator接口。
* 在实现类实现泛型接口时,如已将泛型类型传入实参类型,则所有使用泛型的地方都要替换成传入的实参类型
* 即:Generator<T>,public T next();中的的T都要替换成传入的String类型。
*/
public class AnimalGenerator implements Generator<String> {
private String[] animals = new String[]{"Fox", "Bird", "Fish"};
@Override
public String next() {
Random rand = new Random();
return animals[rand.nextInt(3)];
}
}
(2)泛型类
泛型类也就是把泛型定义在类上,这样用户在使用类的时候才把类型给确定下来。
public class ObjectTool<T> {
private T obj;
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
}
可以看到上面这个程序,在使用时如果定义了类型,那么在使用时就可以不用进行强制类型转换,直接就可以得到一个T类型的对象。
(3)泛型方法
有时候只关心某个方法,那么使用泛型时可以不定义泛型类,而是只定义一个泛型方法,如下
public <T> void play(T t) {
System.out.println(t);
}
需要注意一下定义的格式,泛型必须得先定义才能够使用。
- 上一篇: Java路径-39-Java的泛型
- 下一篇: Java泛型
猜你喜欢
- 2024-11-19 Java基础:泛型,设计的灵活与局限
- 2024-11-19 Java必学:深入了解泛型
- 2024-11-19 你真的了解java中的泛型吗?
- 2024-11-19 你了解Java泛型吗?
- 2024-11-19 Java核心知识 基础五 JAVA 泛型
- 2024-11-19 Java泛型详解
- 2024-11-19 Java中的泛型是什么?
- 2024-11-19 Java/Scala 泛型快速入门教程
- 2024-11-19 Java高级特性—泛型看这一篇就够了
- 2024-11-19 讲讲Java的泛型
你 发表评论:
欢迎- 最近发表
-
- Java内存溢出紧急处理:10个必知的Linux命令快速定位OOM
- 面试常问的 25+ 个 Linux 命令(linux面试命令大全)
- Java堆外内存溢出紧急处理实战:Linux命令定位与Spring Boot解决
- java开发常用的Linux命令,高频的没你想象的多
- Java 应用 CPU 飙升?8 个 Linux 命令组合拳快速锁定异常线程
- Java 开发者线上问题排查常用的 15 个 Linux 命令
- Java程序员必备的Linux命令:让你的工作效率翻倍
- Java程序员必备的Linux命令全解析
- [超全整理] Java 程序员必备的 100 条 Linux 命令大全
- SAP ABAP资源导航(sap aatp)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)