- 泛型就是定义一种模板,然后在代码中为用到的类创建对应的类型。编译器会自动进行类型检查
- 泛型如果不指定类型,那就默认是Object类型,此时使用泛型就需要进行强制转换。如
List list = new ArrayList(); list.add("Hello"); list.add("World"); Stringfirst = (String) list.get(0);
- 泛型如果不指定类型,那就默认是Object类型,此时使用泛型就需要进行强制转换。如
- 同一种T的子类泛型可以上转型为父类类型,如
ArrayList<Integer>
转List<Integer>
- 但是不能子类T转父类T,如
List<Integer>
转List<Number>
- 无法转换会报
ClassCastException
异常
- 但是不能子类T转父类T,如
- 一个泛型运用可以有多个不同的通配符,表示是多种类型。如
Map<T,V>
- 泛型必须是引用类型,因为Object无法与基本类型进行转换
- 泛型语法:如
List<Number> list = new ArrayList<Number>();
- 前面指明了
,所以后面编译器可以推断出类型 ,所以后面尖括号的Number可以省略...=new ArrayList<>();
- 前面指明了
- 泛型有三种运用:
泛型接口
- 定义一个泛型接口:
**public interface Comparable<T> { int compareTo(T o); }**
要使用泛型接口,毫无疑问需要实现接口。
编写泛型类可以先假设为某种类型进行编写,最后将假设的类型关键字都替换为T即可
- 如下代码将String替换为
T
即可 - 然后类名后加上
<T>
```java public class Pair{ private String first; private String last; public Pair(String first, String last) { this.first = first; this.last = last; } public String getFirst() { return first; } public String getLast() { return last; } }
- 如下代码将String替换为
<a name="ipMDy"></a>
# 泛型方法(静态)
- **泛型方法特指静态的泛型方法。非静态泛型方法定义在泛型类中,属于泛型类**
- 假如在泛型类中编写泛型方法,则泛型方法的通配符不能跟泛型类的通配符相同
- 同时还必须在static关键字后面增加一个带尖括号的通配符
```java
public class Pair<T> {
private T first;
private T last;
public Pair(T first, T last) {
this.first = first;
this.last = last;
}
public T getFirst() { ... }
public T getLast() { ... }
// 静态泛型方法应该使用其他类型区分:
public static <K> Pair<K> create(K first, K last) { //增加了一个<K>
return new Pair<K>(first, last);
}
}
泛型原理-擦拭法
- Java编译器将所有泛型都视为Object类型,然后在编译时根据用户给定的类型对其进行安全的类型转换。
- 如
**List <Double>list=...; list.size();**
经过转换后(Double)list.size()
- 如
擦拭法的局限:
不能是基本类型 ,因为实际类型是Object,Object类型无法转为基本类型- 无法取得带泛型的Class
- 比如说一个类
class Pair<T>
无论T是什么类型,getClass()获得到的都是Pair对象的类,即得到的都是**Pair**
- 比如说一个类
- 无法判断带泛型的类型,原因同2
- 比如说
if (list instanceof List<Double>) {} //直接报错
因为根本不存在List<Double>类型
只有List类型
- 比如说
- 构造方法不能实例化
**T**
类型(因为构造方法内部无法从T拿到class)- 想要实例化T类型,必须借助额外的Class
参数。使用时,也需要传入Class 参数(即传入一个具体Class类型的参数) ```java public class Pair { private T first; private T last; public Pair() { // Compile error: first = new T(); last = new T(); } } 上述代码无法通过编译,因为构造方法的两行语句:
- 想要实例化T类型,必须借助额外的Class
first = new T(); last = new T(); 擦拭后实际上变成了:
first = new Object();
last = new Object();
这样一来,创建new Pair
#
借助Class
``` [
](https://www.liaoxuefeng.com/wiki/1252599548343744/1265104600263968)