二刷java基础第十六天——泛型和类型通配符
Posted 名字真的很急用
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二刷java基础第十六天——泛型和类型通配符相关的知识,希望对你有一定的参考价值。
什么是泛型
- 泛型实际的含义就是任意类型(Object)
- 泛型是jdk5引入的新特性,为了提高编译时期的类型安全检测机制
- E V K :指的就是任意类型
- <> :泛指
- <内容>:类型
- 泛指类型 :泛型
2:泛型的优点
- 可以将运行时的异常提前到编译时
- 避免了数据类型的强制转换
定义泛型类
定义格式
class 类名<类型>{}
定义泛型方法
修饰符 <类型> 返回值类型 方法名(类型 变量名){}
定义泛型接口
修饰符 interface 接口名<类型>{}
同一个文件中,只能有一个public
类型的通配符
<?> :可以匹配任意的类型
类型通配符上限:<? extends Number>
他表示的是类型是Number或者是子类类型
类型通配符的下限: <? super Number>
他表示的是类型Number和Number父类
泛型:泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。
泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{
//key这个成员变量的类型为T,T的类型由外部指定
private T key;
public Generic(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定
this.key = key;
}
public T getKey(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定
return key;
}
}
泛型的类型参数只能是类类型,不能是简单类型。
不能对确切的泛型类型使用instanceof操作。如下面的操作是非法的,编译时会出错。
if(ex_num instanceof Generic<Number>){
}
未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中
* 即:class FruitGenerator<T> implements Generator<T>{
* 如果不声明泛型,如:class FruitGenerator implements Generator<T>,编译器会报错:"Unknown class"
*/
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。
但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符
通配符高级使用----受限泛型
之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的上限和下限。
泛型的上限:
格式: 类型名称 <? extends 类 > 对象名称
意义: 只能接收该类型及其子类
泛型的下限:
格式: 类型名称 <? super 类 > 对象名称
意义: 只能接收该类型及其父类型
以上是关于二刷java基础第十六天——泛型和类型通配符的主要内容,如果未能解决你的问题,请参考以下文章