一、泛型的定义
- 泛型:把数据类型当作参数一样来传递。所以也叫参数化类型;
二、泛型的使用场景
-
泛型集合
-
把泛型定义在集合上,如果不指定具体类型就是
Object
类型;//这里表示Object类型或者任意类型 List<?> Collection<?> c5 = new ArrayList<Object>();//?表示Object类型 Collection<?> c6 = new ArrayList<Animal>();//?表示Animal类型 Collection<?> c7 = new ArrayList<Dog>();//?表示Dog类型 Collection<?> c8 = new ArrayList<Cat>();//?表示Cat类型
注意: 泛型如果前后写的时候,必须前后一致,否则就会报错
-
-
泛型类
-
把泛型定义在类名上,如果不指定就是
Object
类型;public class Person<T>{ //把泛型作为形式参数进行传递 pubic void show(T t){ } //把泛型作为方法的返回值类型,这里需要和泛型方法区分开来 public T show(T t){ return t; } }
-
-
泛型方法
-
将泛型定义在方法上,这里需要注意的是这个泛型参数是专属于方法的,不是类上的泛型参数;
public class Person<T> { //这不是泛型方法 public T show(T t) { return t; } //泛型方法,返回值为void类型 public <R> void show(R r, T t) { } //泛型方法,返回值为定义的泛型R类型 public <R> R function(R r) { return r; } }
-
-
泛型接口
-
将泛型定义在接口上
public interface Inter<T>{ void show(T t); } public class InterImpl<T> implements Inter<T> { @Override public void show(T t) { } }
注意:在接口的实现类如果不明确是什么类型,任然需要定义泛型时,这时
接口
和接口的实现类
都必须标明泛型符号,否则会报错
-
-
泛型通配符
- 泛型通配符
<?>
- 含义:任意类型,如果没有明确,就是
Object
类型,以及任意的java
类;
- 含义:任意类型,如果没有明确,就是
-
<? extends E>
- 向下限定,E及其子类(从左往右看,即?是E的子类,所以是向下限定)
-
<? super E>
- 向上限定,E及其父类 (从右往左看,即E是?的子类,也即?是E的父类,所以是向上限定)
- 泛型通配符
三、泛型擦除
泛型只是在编译期存在,在运行期就不存在了。
网友评论