泛型
generic
泛型的好处
- 编译器自动检查,减少了出错
- 减少了转换次数,提高效率
- 不再提示编译警告
- 使程序员能够实现通用算法
定义
接口和类,方法都可以定义泛型
//泛型类会被在创建实例的时候被确定
// 泛型可以有多个
class Person<T,E>{
}
// 泛型接口会在被继承实现的时候确定
interface Inter<T>{
}
// 泛型方法可以定义在普通类中,也可以定义在泛型类中
// 泛型方法会在方法被调用的时候确定
public <T> int func(){
}
-
T 只能是引用类型,不能是基本数据类型
-
类的普通成员(属性,方法)可以使用泛型,静态方法和属性不可以使用泛型
-
使用泛型的数组不能初始化
-
指定泛型后,可以传入传入该类型或该子类类型的数据
-
在编译期间就确定了泛型
常见的类型参数简写:
- E - Element 元素 (used extensively by the Java Collections Framework)
- K - Key 键
- N - Number 数字
- T - Type 类型
- V - Value 值
- S,U,V etc. - 2nd, 3rd, 4th types
一般来说,parameters形参,arguments实参
使用
Person<Integer> integerPerson;//parameterized type 参数化类型
Person<String> stringPerson = new Person<String>("一万");//创建实例
Person<Double> doublePerson = new Person<Double>(78.8);
//后面的类型可以不写,简写,编译器会推断,推荐
Person<Double> doublePerson2 = new Person<>(78.8);
//默认的类型是Object,尽量不要使用
ArrayList arrayList = new ArrayList();
有界类型参数
<T extends B1 & B2 & B3>
子类型
通过extends 和implments实现的类型
Box<Integer>
不是Box<Number>
的子类型,即使Integer
是Number
的子类型
通配符
wildcard
package com.generic_;
import java.util.ArrayList;
public class Test02 {
public static void main(String[] args) {
ArrayList<Object> list= new ArrayList<>();
ArrayList<String> list2 = new ArrayList<>();
ArrayList<AA> list3 = new ArrayList<>();
ArrayList<BB> list4 = new ArrayList<>();
ArrayList<CC> list5= new ArrayList<>();
func1(list);
func1(list2);
func1(list3);
func1(list4);
func1(list5);
// func2(list);//no
// func2(list2);//no
func2(list3);
func2(list4);
func2(list5);
func3(list);
func3(list2);//no
func3(list3);
func3(list4);//no
func3(list5);//no
}
// <?>表示任意泛型都可以
public static void func1(ArrayList<?> list){
}
// <? extends AA>表示只有AA以及继承了AA的泛型才可以,规定了上限
public static void func2(ArrayList<? extends AA> list){
}
// <? super AA>表示只有AA以及AA的父类才可以,规定了下限
public static void func3(ArrayList<? super AA> list){
}
}
class AA{
}
class BB extends AA{
}
class CC extends BB{
}