本质是参数化类型,把类型作为参数传递
常见的使用类型:泛型类,泛型接口,泛型方法
语法:< T> T 称为类型占位符,表示一种引用类型
好处:提高代码的重用性
防止类型转换异常,提高代码的安全性
List al = new ArrayList();
//添加元素
al.add("a");
al.add("b");
al.add("c");
al.add(100);
//遍历集合
for (int i = 0; i<al.size() ; i++) {
String s = (String) al.get(i);
System.out.println(al.get(i));
}
此代码会报错ClassCastException,如果声明集合时规定泛型
List<String> al = new ArrayList();
则,在编译时就会报错,al.add(100),100为Integer类型。
语法:类名后面加。<>里面写占位符,可以写多个,用逗号隔开。
T是类型占位符,表示一种引用类型。
public class demo1 <T>{}
创建变量
作为方法的参数
作为方法的返回值
//创建变量
T t;
//泛型作为方法的参数使用
public void show(T t){
System.out.println(t);
}
//泛型作为方法的返回值使用
public T show2(){
return t;
}
因为T作为泛型,具体类型未知,所以不能用来创建对象
//不能使用 T t = new T();
public static void main(String[] args) {
//使用泛型类创建对象
//创建对象时传入类型的参数<String>,不传入则后面不会规定t必须为String类型
Demo1<String> demo1 = new Demo1<String>();
demo1.t = "hello";
demo1.show("你好");
String str = demo1.show2();
//创建对象时传入类型的参数<Integer>
Demo1<Integer> demo2 = new Demo1<Integer>();
demo2.t = 100;
demo2.show(200);
Integer integer = demo2.show2();
}
泛型只能是引用类型
不同的泛型对象不能相互赋值
语法:接口名后面加<>
接口中可以写抽象方法和静态常量(默认由public static final修饰)
不能使用泛型创建静态常量
public interface Demo2<T> {
//泛型接口interface
//创建一个静态常量
//T t;不能使用泛型创建静态常量
String s="interface";
//用泛型创建一个抽象方法
T show(T t);
}
implements接口后面要写具体的类型。
implements Demo2<String>
public class Demo2impl implements Demo2<String> {
@Override
public String show(String s) {
System.out.println(s);
return s;
}
}
Demo2impl demo2impl = new Demo2impl();
demo2impl.show("hello");
public class Demo2impl2<T> implements Demo2<T> {
@Override
public T show(T t) {
System.out.println(t);
return t;
}
}
实现类类名后面的与接口名之后的是同一个类型
方法重写的返回类型也为T
T的具体类型在创建类对象new 时具体写
Demo2impl2<String> demo2impl2 = new Demo2impl2<String>();
demo2impl2.show("hello java");
语法:与泛型类和泛型接口不同 要放在方法返回类型前面
+返回值类型 的作用域仅在方法体内
//创建一个泛型方法
public <T>T method(T t){
System.out.println(t);
return null;
}
Demo3 demo3 = new Demo3();
demo3.method(800);//T自动变为int
demo3.method("hello world");//T自动变为String
demo3.method(3.14);//T自动变为double
提高重用性,例如在泛型方法中,要实现以下程序,要方法重载,method方法要写三遍,用泛型之后 写一遍就行。用一个方法就可以传递任何类型的数据
Demo3 demo3 = new Demo3();
demo3.method(800);//T自动变为int
demo3.method("hello world");//T自动变为String
demo3.method(3.14);//T自动变为double
防止类型转换异常,提高代码安全性。
泛型在集合中的使用
概念:参数化类型,类型安全的集合,强制集合元素的类型必须一致。
特点:编译时即可检查,而非运行时抛出异常
访问时不用类型转换
不同泛型之间引用不能相互赋值,泛型不存在多态。