目录
1.泛型的定义
2.泛型的使用
3.泛型通配符
一、泛型的定义
泛型是java5的新特性,使用泛型会让程序编写简单安全,在编译的时候就会检查类型是否安全
定义:所谓泛型就是允许在定义类、接口和方法使用参数类型这个类型形参可以在声明变量、
创建对象、调用方法时动态指定(类型实参)泛型的参数类型只能是引用类型,不能是基本类型
二、泛型的使用
1.泛型接口
泛型接口格式:
修饰符 interface 接口名<T...>{}
泛型接口Demo:
public interface Action<E> { //在接口中使用泛型E E getE(); //在接口中使用泛型抽象方法 <T> T getT(int i); }
2.泛型类
泛型类格式:
修饰符 class 类名<T...>{
使用T; }
泛型类Demo:
//类上声明泛型E public class ActionImpl<E>{ //声明E类型变量 private E e; //使用E类型 public E getE() { // TODO Auto-generated method stub return e; } public ActionImpl(E e){ this.e = e ; } }
3.泛型方法
泛型方法格式:
修饰符<T...> 返回值 方法名 (参数列表){
使用T; }
泛型方法Demo:
public class GenericWay { //方法上声明泛型T类型 public static <T> T get(T t){ return t; } }
三、泛型通配符
泛型通配符的符号是?
普通的泛型与泛型通配符的泛型Class<T>与Class<?>的区别在于:
Class<T> :在实例化的时候,T需要替换成具体的类型
在泛型类、方法中可以使用T,还可以操作T类型的变量
Class<?>:他是通配符,?可以表示任何类型(使用了泛型)
泛型通配符可以匹配任意类型。
泛型通配符Demo:
import java.util.ArrayList; import java.util.List; public class GWC { //参数是list,list里的类型可以是任意类型 public void forList(List<?> l){ for (Object object : l) { System.out.println(object); } } public static void main(String[] args) { GWC gwc = new GWC(); List<Integer> l1 = new ArrayList<>(); l1.add(1); l1.add(2); gwc.forList(l1); List<String> l2 = new ArrayList<>(); l2.add("1"); l2.add("2"); gwc.forList(l2); } }
通配符上限
举个栗子:
List<? extends Number> 这么声明的数只能是number类型或number类型的子类
通配符上限Demo:
import java.util.ArrayList; import java.util.List; public class GWCTop { public void forList(List<? extends Number> l){ for (Number number : l) { System.out.println(number); } } public static void main(String[] args) { GWCTop gwcTop = new GWCTop(); //Object 类型是number类型的父类编译报错; //List<Object> list = new ArrayList<>(); //String 类型不是number编译器报错; //List<String> list = new ArrayList<>(); List<Number> list = new ArrayList<>(); gwcTop.forList(list); } }
通配符下限
举个栗子:
List<? super Number> 这么声明的数只能是number类型或number类型的父类
通配符下限Demo:
import java.util.ArrayList; import java.util.List; public class GWCUnder { public void forList(List<? super Number> l){ for (Object object : l) { System.out.println(object); } } public static void main(String[] args) { GWCUnder gwcUnder = new GWCUnder(); //Integer 类型是Number类型的父类,编译不通过; //List<Integer> list = new ArrayList<>(); //String 类型不是Number类型的父类,编译不通过; //List<String> list = new ArrayList<>(); List<Object> list = new ArrayList<>(); gwcUnder.forList(list); } }