泛型的高级应用
泛型的高级应用分为三种:一、?二、extends 三、super
一、泛型中的通配符“?”相当于多态中的Object,泛型中要兼容所有的类型要用“?”使用通配符“?”后,里面的元素只能调用Object的函数。
二、泛型的上限:extends,限定父类
上限的应用场合:,往集合当中加入元素
三、泛型的下限:super
多个子类的公共部分即他们的父类
下限的应用场合:从集合当中把元素读取出来,进行操作(调用所有集合中的元素的父类的方法)
我们要注意的是:泛型没有多态,因为泛型只有编译期。
下面我们通过实例代码来理解:
- package cn.hncu.generic.three;
-
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
-
-
-
-
-
-
-
- public class GenericAdvDemo1 {
-
- public static void main(String[] args) {
- List<String> list=new ArrayList<String>();
- list.add("***");
- list.add("aaa");
- list.add("hello word");
- print(list);
- List<Integer> list2=new ArrayList<Integer>();
- list2.add(100);
- list2.add(111);
- list2.add(123);
- print(list2);
-
-
- }
-
- private static void print(List<?> list) {
- Iterator<?> it=list.iterator();
- while(it.hasNext()){
- System.out.println(it.next());
- }
- }
-
- }
- package cn.hncu.generic.three;
-
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
-
-
-
-
-
- public class GenericAdcDemo2 {
- public static void main(String[] args) {
- List<Person> list=new ArrayList<Person>();
- list.add(new Person("Jack", 20));
- list.add(new Person("Cv", 21));
- list.add(new Person("WWW", 22));
- print(list);
-
- List<Student> list2=new ArrayList<Student>();
- list2.add(new Student("qqq", 22, 1));
- list2.add(new Student("eee", 23, 2));
- list2.add(new Student("qwer", 20, 3));
- print(list2);
- }
- public static void print(List<? extends Person> list){
- Iterator<? extends Person> it=list.iterator();
- while(it.hasNext()){
- System.out.println(it.next());
- }
- }
- }
- class Person{
- String name;
- int age;
- public Person(String name, int age) {
- super();
- this.name = name;
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public int getAge() {
- return age;
- }
- @Override
- public String toString() {
- return "Person [name=" + name + ", age=" + age + "]";
- }
-
- }
- class Student extends Person{
- private int no;
-
- public Student(String name, int age, int no) {
- super(name, age);
- this.no = no;
- }
-
- @Override
- public String toString() {
- return "Student [no=" + no + ", name=" + name + ", age=" + age + "]";
- }
-
-
-
- }
T 和 ?的区别
?表示任意的都可以,T则是作为参数定义的。
java 泛型中 T 和 问号(通配符)的区别
类型本来有:简单类型和复杂类型,引入泛型后把复杂类型分的更细了;
现在List<Object>, List<String>是两种不同的类型
;且无继承
关系;
泛型的好处如:
开始版本
public void write(Integer i, Integer[] ia);
public void write(Double d, Double[] da);
泛型版本
public <T> void write(T t, T[] ta)
简便了代码
定义泛型
1.定义在类后面
紧跟类名
后面
public class TestClassDefine<T, S extends T>{}
定义泛型 T, S, 且S 继承 T
2.定义在方法装饰符
后面
紧跟修饰符
后面(public)
public <T, S extends T> T testGenericMethodDefine(T t, S s){}
定义泛型 T, S, 且S 继承 T
实例化泛型
第一声明类变量
或者实例化时
。例如
List<String> list;
list = new ArrayList<String>;
第二继承类
或者实现接口
时。例如
public class MyList<E> extends ArrayList<E> implements List<E> {...}
当调用范型方法时,编译器自动对类型参数(泛型)
进行赋值,当不能成功赋值时报编译错误
通配符(?)
上面有泛型的定义
和赋值
;当在赋值
的时候,上面一节说赋值的都是为具体类型
,当赋值的类型不确定
的时候,我们用通配符(?)
代替了:
如
List<?> unknownList;
List<? extends Number> unknownNumberList;
List<? super Integer> unknownBaseLineIntgerList;
在Java集合框架中,对于参数值是未知类型
的容器类,只能
读取其中元素,不能
向其中添加元素, 因为,其类型是未知,所以编译器无法识别添加元素的类型和容器的类型是否兼容,唯一的例外是NULL