Java——泛型
Posted 老赖的小弟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java——泛型相关的知识,希望对你有一定的参考价值。
文章目录
Java中泛型的概述
泛型广泛的类型
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型,其实就是将程序运行时可能发生的问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。白话说就是泛型是提供给javac编译器使用的,用于限定数据类型,让编译器在源代码级别上识别出非法数据
如果对于什么是编译器及程序是怎么在Java环境中运行的可以看看下面这篇:
Java中泛型的语法规则
泛型格式:
集合类<泛型类型> 变量名 = new 集合类<泛型类型>();
例如:
ArrayList<String> arrayList = new ArrayList<String>();
既然例子是ArrayList的,那么就将就用这个例子说明吧
1、ArrayList,其中<>这对尖括号读作typeof
2、ArrayList,其中的E称为类型参数,整个称为ArrayList泛型类型
3、ArrayList中的String称为实际类型参数,整个ArrayList称为参数化的类型
泛型集合
1、支持泛型的集合中只能存放该集合声明的的泛型指定类型元素
定义的泛型是integer所以存放String就会报错,编译都没有通过
2、关于支持泛型的集合其自带的方法也支持泛型(即在集合的实现类中,都对泛型提供了较好的支持,使用泛型后取出元素不需要类型转换)
泛型方法
如果要在函数上使用一个不明确的数据类型,就可以使用泛型进行定义。在Java程序中普通方法、构造方法中都可以使用泛型。方法使用泛型前,必须对泛型进行声明
语法如下:
public <泛型的声明> 返回值类型 函数名(泛型 变量名)
注意:通常需要放在方法的返回值声明之前,其中T可以是任意字母表示,但是需要大写
例如:
public <T> T getData(T data)
return null;
泛型方法示例(代码演示)
代码如下(示例):
public class Test01
public static void main(String[] args)
// 实例化Test01(为方便后续的测试)
Test01 test01 = new Test01();
// 实参为String
test01.getData("这是方法泛型");
// 实参为int类型
test01.getData(123456);
// 实参为匿名对象
test01.getData(new Object());
// 弄一个泛型不限的(基本就是object类型的),没有返回值,需要参数的getData方法
public <T> void getData(T data)
System.out.println(data);
代码如下(输出):
这是方法泛型
123456
java.lang.Object@70dea4e
小结
从这个例子中可以看出我事先定义的getData方法的泛型是所有类型,所及基本所有数据类型都适用,但是如果改变它的泛型的话,那么就只能接受你泛型声明的那个数据类型(引用类型)
泛型类
如果一个类中多处都要用到同一个泛型,这事可以把泛型定义在类上
语法如下:
修饰符 class 类名<泛型>
注意: 静态方法不能使用泛型上定义的泛型,应该将它定义为泛型方法
泛型类示例(代码演示)
代码如下(示例):
public class Test02<T>
public static void main(String[] args)
// 实例化Test02(为方便后续的测试)
Test02<Object> test02 = new Test02<>();
test02.say("这是类的泛型");
public void say(T world)
System.out.println(world);
代码如下(输出):
这是类的泛型
小结
如果当这个类声明了泛型,这个类里面的方法都得声明对应的泛型,否则,编译都不能进行
泛型接口
语法如下:
interface 接口名<泛型>
泛型接口示例(代码演示)
代码如下(定义一个带有泛型的接口):
public interface MyInterface<T>
public void print(T data);
代码如下(实现这个接口的类):
public class MyInterfaceImpl<T> implements MyInterface<T>
// 实现接口中的print方法
@Override
public void print(T data)
System.out.println(data);
代码如下(测试):
public class Test03
public static void main(String[] args)
// 实例化实现类
MyInterfaceImpl<Integer> myInterfaceImpl01 = new MyInterfaceImpl<>();
myInterfaceImpl01.print(123456);
MyInterfaceImpl<String> myInterfaceImpl02 = new MyInterfaceImpl<>();
myInterfaceImpl02.print("这是接口的实现");
代码如下(输出):
123456
这是接口的实现
高级泛型
向下限定,T及其子类
语法如下:
<? extends T>
向上限定,T及其父类
语法如下:
<? super T>
任意类型,如果没有明确,那么就是object及其任意的类了
语法如下:
<?>
总结
注意:泛型类型必须是引用类型(比如 int 的引用类型是Integer)
泛型感觉是一个约束,所谓无规矩不成方圆嘛
个人感觉集合泛型和方法泛型常见一点,其他的比如接口泛型在底层原码中可以看看,还有就是高级泛型基本就是框架底层中能看看
以上是关于Java——泛型的主要内容,如果未能解决你的问题,请参考以下文章