当定义类时,有些方法的参数是不能够确定的,可以用泛型类名来表示,当类的对象创建时会指出具体的类型,类型作为参数传递给泛型,从而进行使用。
1.不使用泛型:创建集合对象时,如果不指定类型,默认是object类型
优点:可以存储任意类型。
弊端:在使用元素时,要类型转换,容易引发异常。
2.使用泛型:优点:把运行时异常提升到了编译时异常,不用类型转换。
弊端:只能存储单一类型。
public class GenericClass { public static void main(String[] args) { User user1 = new User(); //当不指定泛型时,默认是object类型 user1.setUser("hello"); Object obj = user1.getUser(); User<Integer> user2 = new User<>();//使用泛型,类型为integer user2.setUser(123); Integer user = user2.getUser(); User<String> user3 = new User<>();//使用泛型,类型为string user3.setUser("hhhhhhh"); String u = user3.getUser(); } } class User<E>{ //定义泛型 private E user; public E getUser() { return user; } public void setUser(E user) { this.user = user; } } 复制代码
修饰符 泛型 返回值 方法名(参数(可使用泛型)){ 方法体 } 复制代码
public class GenericMethod { public static void main(String[] args) { GenericMethod gm = new GenericMethod(); gm.m1(123); //方法参数可以是任意类型 gm.m1("hello"); gm.m1(true); GenericMethod.m2("hello"); GenericMethod.m2(123); GenericMethod.m2(10); } //定义含有泛型的方法 public <M> void m1(M m){ //参数列表可使用泛型 System.out.println(m); } //定义含有泛型的静态方法 public static <M> void m2(M m){ System.out.println(m); } } 复制代码
定义接口
public interface GernericInterface<I> { void print(I i); } 复制代码
实现方式一:指定具体类型
public class GernericInterfaceImpl1 implements GernericInterface<String>{ @Override public void print(String s) { System.out.println(s); } } 复制代码
实现方式二:不进行具体类型的指定,创建类对象时再指定
public class GernericInterfaceImpl2<I> implements GernericInterface<I>{ @Override public void print(I i) { System.out.println(i); } } 复制代码
测试
public class GernericInterfaceTest { public static void main(String[] args) { //第一种方法测试 GernericInterfaceImpl1 g1=new GernericInterfaceImpl1(); g1.print("hello"); //第二种方法测试 GernericInterfaceImpl2<Integer> g2 = new GernericInterfaceImpl2<>(); g2.print(123); } } 复制代码
语法格式<?> 可以接受不明确的类型
可用于方法的参数中,不能用在创建对象中。
例子
public class demo_3_Generic { public static void main(String[] args) { ArrayList<Integer> list1 = new ArrayList<>();//创建两个不同类型的集合 list1.add(100); list1.add(200); ArrayList<String> list2 = new ArrayList<>(); list2.add("hello"); list2.add("world"); printArrayList(list1); //都调用打印方法 printArrayList(list2); } public static void printArrayList(ArrayList<?> list){ //运用通配符 Iterator<?> it = list.iterator(); while (it.hasNext()){ System.out.println(it.next()); } } } 复制代码
泛型的上限限定:<? extends E> 接收参数的类型必须是E类型的 子类 或 本身
泛型的下限限定:<? super E> 接收参数的类型必须是E类型的 父类 或 本身