一般类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类。如果要编写可以应用与多重类型的代码,这种刻板的限制对代码的束缚就会很大。
泛型的概念:
泛型实现了参数化类型的概念,使代码可以应用于多重类型。“泛型”这个术语的意思是:适用于许多许多的类型。泛型在编程语言中出现时,其最初的目的是希望类或方法能够具备最广泛的表达能力。
泛型的类型擦除:
java泛型是用擦除来实现的,这意味着当你在使用泛型时,任何具体的类型信息都被擦除了,你唯一知道的就是你在使用一个对象。例如List<String>和List<Integer>
在运行时事实上是相同的类型,这两种形式都被擦除成他们最"原生"类型,即List。泛型只在编译阶段有效,泛型类型在逻辑上可以看成是多个不同的类型,但是其实质都是同一个数据类型,编译之后,程序会才去去泛型化措施。
**
泛型通配符<? 继承 ?>的分类与含义:
**
泛型类型参数将擦除到它的第一个边界。
1、无边界通配符
<?>
通配符理解
我们知道ArrayList 是典型的泛型类.即可以限制存储的元素的元素类型.ArrayList<String>
指定存入的元素时string. ArrayList<Integer>
指定存储元素为Integer类型. 但是如果只有我们使用的时候才能明确知道存入类型时.我们可以使用ArrayList<?>
来表示通用的类型.
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("zhangsan");
List<Number> list2 = new ArrayList<>();
list2.add(3);
list2.add(4);
loop(list1);
loop(list2);
}
public static void loop(List<?> list){
for (int i = 0 ; i < list.size() ; i++) {
System.out.println(list.get(i));
}
}
案例中的 ? 代表着限定通用类型. 或者这么理解.代表可变的参数类型
2、上界通配符
<? extends Number >
代表参数是从Number往下的子类或者孙类对象都是可以的.
3、下界通配符
<? super Integer>
代表从Integer 到 Object 所有对象都是可以的。
草草总结下当前的理解,欢迎指正问题与补充理解方式!