跟王老师学泛型:泛型拾遗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跟王老师学泛型:泛型拾遗相关的知识,希望对你有一定的参考价值。
泛型拾遗
主讲教师:王少华 QQ群:483773664
学习目标
掌握泛型方法与类型通配符的区别
泛型与方法重载
泛型与数组
一、泛型方法和类型通配符的区别
(一)大多数时候,可以使用泛型方法来替换类型通配符
掌握泛型方法与类型通配符的区别
泛型与方法重载
泛型与数组
比如这样一个需求:定义一个方法,接收一个任意集合,并打印出集合中的所有元素。泛型方法和类型通配符都可以实现
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Need { public <T> void printCollection(Collection<T> c){ for (T t : c) { System.out.println(t); } } public void printCollection2(Collection<?> c){ for (Object object : c) { System.out.println(object); } } } |
(二)有时候,我们可以同时使用泛型方法和通配符
1 2 | public <T> void copy(List<T> dest,List<? extends T> src){ } |
当然上面的方法也可以改写成泛型方法
1 2 3 | public <T ,E extends T> void copy2(List<T> dest,List<E> src){ } |
(三)类型可以定义变量
1 2 3 4 5 | public <T> void printCollection(Collection<T> c){ for (T t : c) { System.out.println(t); } } |
(四)set<E>只允许放E类型的元素,set<?>等于set<? extends Object>,只能取元素不能放元素
add(E)
二、泛型方法与方法重载
方法重载:方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
(一)第一情况:泛型的上下限
因为泛型既允许设定通配符的上限,也允许设定通配符的下限
那么下面的二个方法是方法重载吗?
1 2 3 4 5 | public <T> void copy(List<T> dest,List<? extends T> src){ } public <T> void copy(List<? super T> dest,List<T> src){ } |
原因
1 2 3 4 5 6 7 8 | public class Test { public static void main(String[] args) { List<Number> c = new ArrayList<Number>(); List<Integer> c1 = new ArrayList<Integer>(); Need need = new Need(); need.copy(c, c1); } } |
编译器无法确定调用哪个方法了。
当然上面的二个方法在编译的时候,就无法通过了!
(二)泛型指定类型不一样
1 2 3 4 | public void method(List<String> list) { } public void method(List<Integer> list) { } |
这种写法是不正确的,编译无法通过。
这是因为从Java语言层面来说,方法重载依赖于相同的方法名、不同的参数个数、类型、顺序,而List<Integer>和List<String>类型擦除后都为List<E>,从而不符合方法重载的要求。
注:
在jdk6及以下的版本,以下代码编译是会通过的,jdk7,编译不会通过,jdk8编译也会通过
1 2 3 4 5 6 7 | public String test(List<String> list) { return "" ; } public int test(List<Integer> list) { return 1 ; } |
三、泛型与数组