为什么要使用泛型:
为了让集合的使用更加安全,若不使用泛型的话,集合取出来的是object,调用特定对象的方法需要强转,从而也容易导致类型转换异常。引入泛型后让运行时可能出现的异常提前到了编译器,加入泛型后,若添加的类型与泛型不符合的话,编译时期就会出现红色波浪线报错。
当泛型类中的方法要操作的类型和类上的泛型类型不一样的话,需要在方法上另外定义一个泛型形参
class Util<W>{ //当方法要操作的类型不确定和类上的泛型不一定一样。这时可以将泛型定义在方法上。 public <Q> void show(Q q){//泛型方法 System.out.println("show:"+q); }
}
Util<Integer> util2 = new Util<Integer>(); util2.show("hehe");
如果是静态方法还需要使用泛型,必须定义在方法上
实现/继承的两种情况
class zi<T> implements fu<T>{} class zi implements fu<String>{}
通配符 Collection<?> = Collection<Object>,如果要接受所有可能的类型用Collection<?>作为形参,如果要对传入的类型进行限定则使用Collection<? extends Person>作为形参,可以接受Collection<Person> ,Collection<Worker>,Collection<Student>等实参
public static <T extends Comparable<? super T>> T getMax(Collection<? extends T> c,Comparator<? super T> comp){}
getMax(c3);//已经做了限定,说明传递的集合中的元素类型必须是Comparable的子类。否则编译失败。没实现comparable不能作为参数传入