泛型概述:在类型转换的过程中,向上转型是没有问题的,但是向下转型的时候隐含了强制转换的问题,这样的程序是不安全的,而泛型是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。泛型一般在集合中使用
格式:<数据类型> 此处的数据类型只能是引用类型
泛型的三种应用
泛型类:public class 类名<泛型类型>{ }
/** * @author 张建辉 * @param <T>定义泛型类 */ public class ObjectTool<T>{ //在类名后加<T>表示在测试类中给什么样的泛型就传什么数据类型 private T obj; public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } } 测试类 public class ObjectToolDemo { public static void main(String[] args) { ObjectTool<String> ot=new ObjectTool<String>();//在对象实例化时添加泛型,类名后加<数据类型>,可以避免赋值时的类型转换, 一旦不符合泛型类型,在编译时就直接报错。 ot.setObj(new String("张建辉")); String s=ot.getObj(); System.out.println(s); } }
泛型方法:public <泛型类型> 返回类型 方法名 (泛型类型)
public class ObjectTool2 { public <T> void Show(T t){ System.out.println(t); } } 测试类: public class ObjectToolDemo2 { public static void main(String[] args) { ObjectTool2 ot2=new ObjectTool2(); //赋值什么样的类型数据,在泛型方法中就传什么类型 ot2.Show("张建辉"); ot2.Show("22"); } }
泛型接口:public interface 接口名<泛型类型>{ }
定义接口:接口中的方法默认为public abstract,所以抽象方法没有方法体 public interface Inter<T>{ public abstract void show(T t); } 定义实现类:类名后和接口名后都要加泛型 public class InterImpl<T> implements Inter<T>{ public void show(T t){ System.out.println(t); } } public class InterDemo { public static void main(String[] args) { //第二种情况:不知道什么类型 Inter<String> i1=new InterImpl<String>(); i1.show("world"); } }
泛型的好处:
A:把运行时期的问题提前到了编译期间
B:避免了强制类型转换
C:优化了程序设计,解决了黄色警告线问题,让程序更安全
泛型高级通配符:
(1)明确的类型
Collocation<Object> c1=newArrayList<Object>();泛型明确写的时候前后必须一致
(2)通配符“?”表示任意的类型都是可以的
Collocation<?> c1=new ArrayList<Object>();
Collocation<?> c2=new ArrayList<Animal>();
Collocation<?> c3=new ArrayList<Dog>();
Collocation<?> c4=new ArrayList<Cat>();
(3)通配符“? extends E ” 向下限定,E及其子类
Collocation<?extends Animal> c5=new ArrayList<Object>();//报错
Collocation<?extends Animal> c6=new ArrayList<Animal>();
Collocation<?extends Animal> c7=new ArrayList<Dog>();
Collocation<?extends Animal> c8=new ArrayList<Cat>();j
(4)通配符“? super E” 向上限定,E及其父类
Collocation<?super Animal> c9=new ArrayList<Object>();
Collocation<?super Animal> c10=new ArrayList<Animal>();
Collocation<?super Animal> c11=new ArrayList<Dog>(); //报错
Collocation<?super Animal> c12=new ArrayList<Cat>(); //报错