1. 什么是泛型?
泛型,即参数化类型 - 将类型由原来的具体类型参数化
类似于方法中的变量参数,此时类型也是参数形式(类型形参、类型实参)
泛型的在不创建新类型的情况下,通过指定不同类型,控制形参具体限制的类型
在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
举个栗子
import java.util.ArrayList;
import java.util.List;
public class Generic{
public static void main(String [] args){
List list = new ArrayList();
list.add("string");
list.add(100);
for(int i = 0; i < list.size(); i++){
// !! Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
String name = (String) list.get(i);
System.out.println("name: " + name);
}
}
}
上述代码中,ArrayList
有String
和Integer
,而两者都以String
格式使用,所以出现了错误。
小修,但仍不能实现list.add(100)
List<String> list = new ArrayList<String>();
2. 泛型类
泛型类是拥有一个或者多个类型变量的类
举个栗子
- 泛型类只能用在成员变量上,并且只能使用引用类型
- 括号中的T(形式类型参数),可随意指定
- 当类被使用的时候,要使用具体的实际类型参数
public class Generic{
public static class Point<T>{
private T var;
public void setVar(T x){
this.var = x;
}
public T getVar(){
return this.var;
}
}
public static void main(String[] args){
Point<Float> p = new Point<Float>();
p.setVar(new Float(100.12f));
System.out.println(p.getVar());
}
}
3. 泛型方法
- 类型参数声明:
- 在方法返回类型前,尖括号分隔
- 包含一个或多个类型参数,参数间逗号隔开。
- 返回值类型声明:可用类型参数
- 泛型参数:也被称为类型变量,用于指定一个泛型类型名称的标识符
- 方法体声明:和其他方法一样。类型参数只能代表引用型类型,不能是原始类型(int,double,char)
public class GenericMethod {
int var = 100;
String varStr = "Hello world";
public <T> T Method(T a){
return a;
}
public static void main(String[] args){
GenericMethod m = new GenericMethod();
System.out.println(m.<Integer>Method(m.var));
System.out.println(m.<String>Method(m.varStr));
}
}
4. 泛型接口
interface Info<String>{
public void setVar(String var);
public String getVar();
}
class InfoImpl implements Info<String>{
private String var;
public InfoImpl(String var){
this.setVar(var);
}
@Override
public void setVar(String var){
this.var = var;
}
@Override
public String getVar(){
return this.var;
}
}
public class GenericInterface {
public static void main(String[] args){
InfoImpl info = new InfoImpl("hahaha");
System.out.println(info.getVar());
}
}
5. 类型通配符
- 类型通配符指在不确定具体参数时,用
?
代替。 ?
表示未知类型,给类型参数赋予不确定值,只能用于声明类型、方法参数,不能用于定义泛型类上
import java.util.ArrayList;
import java.util.List;
public class GenericType {
public static void test(List<?> list){
List<?> list2;
list2 = new ArrayList<String>();
list2 = new ArrayList<Integer>();
list2 = new ArrayList<Object>();
}
public static void main(String[] args){
test(new ArrayList<String>());
test(new ArrayList<Integer>());
test(new ArrayList<Double>());
}
}