跟王老师学泛型:泛型拾遗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跟王老师学泛型:泛型拾遗相关的知识,希望对你有一定的参考价值。

泛型拾遗

主讲教师:王少华 QQ群:483773664

学习目标

  1. 掌握泛型方法与类型通配符的区别

  2. 泛型与方法重载

  3. 泛型与数组

一、泛型方法和类型通配符的区别

(一)大多数时候,可以使用泛型方法来替换类型通配符

比如这样一个需求:定义一个方法,接收一个任意集合,并打印出集合中的所有元素。泛型方法和类型通配符都可以实现

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;
}

三、泛型与数组

(一)、Java不支持泛型的数组对象

1、不能创建持有泛型的数组对象

技术分享


2、正确定义方法

技术分享

3、取值

以上是关于跟王老师学泛型:泛型拾遗的主要内容,如果未能解决你的问题,请参考以下文章

跟王老师学泛型使用泛型

跟王老师学泛型: 自定义带泛型声明的方法

跟王老师学泛型:限制通配符

跟王老师学泛型:类型通配符

跟王老师学泛型:Java自动装箱与拆箱

跟王老师学泛型:泛型的应用