1.泛型的概述
集合<引用数据类型>,限定集合中可以存放的数据类型,该集合只能存放该类对象或者该对象的子类,大大增强了安全性,一般使用一个大写字母表示,如<E>,<Q>
2.泛型的好处
- 泛型使用的初衷:避免由Object向下转型时,转换的类型是无效的,比如储存时我们向集合中储存的是Student类,在存储时自动提升为Object类,但是我们向下转型时可能用Teacher类去接收,这时候就会出现错误。。
提高了安全性(将运行时错误转化为了编译时错误)
省去了强转的麻烦 - 注意事项:前后泛型必须一致,后面的泛型可以省略不写(1.7版本新特性)
- 泛型一般不定义为Object类
例:用泛型进行遍历
ArrayList<Student> arrayList = new ArrayList<>();
arrayList.add(new Student("张三",23));
arrayList.add(new Student("李四",24));
Iterator<Student> iterator = arrayList.iterator();
while (iterator.hasNext()) {
Student student = iterator.next();
System.out.println(student.getName() + " " + student.getAge());
}
3.泛型的应用
- 泛型类,可以用于自定义类
- 泛型方法:(非静态方法)尽可能与类的泛型一致,如果不一致在方法声明上加泛型【格式为:public
<引用数据类型> void
】
(静态方法)必须 有自己的泛型【格式:public static <> void】
class Per<Q> {
private Q q;
public Q getQ() {
return q;
}
//泛型与类一致
public void setQ(Q q) {
this.q = q;
}
//泛型与类不一致
public<W> void mood(W w) {
System.out.println(w);
}
//静态方法必须写泛型
public static<E> void mu(E e) {
System.out.println(e);
}
}
- 泛型接口
interface Inter<E> {
public void run(E e);
}
class Ter implements Inter<String> { //使用这种更好
@Override
public void run(String s) {
System.out.println(s);
}
}
class Tee<Q> implements Inter<Q>{//对实现接口的扩展功能不太好,没有达到扩展的目的
@Override
public void run(Q q) {
System.out.println(q);
}
}
4.泛型通配符
当接收的引用数据(右边的)类型不确定时,(在左边)可以使用通配符<?>
,代表任意类型
- ?extends E :向下限定,代表E及其子类
- ? super E:向上限定,代表E及其父类
例:
ArrayList<Person> arrayList = new ArrayList<>();
arrayList.add(new Person("张三",23));
arrayList.add(new Person("李四",24));
ArrayList<Student> arrayList1 = new ArrayList<>();
arrayList1.add(new Student("王五",23));
arrayList.addAll(arrayList1);
System.out.println(arrayList);
}
}
class Person {
private String name;
private int age;
public Person() {}
public Person(String name,int age) {
this.age = age;
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return ("(" + name + " " + age + ")");
}
}
class Student extends Person{
public Student() {}
public Student(String name,int age) {
super(name, age);
}