泛型的概述和使用
ArrayList<E> a=new ArrayList<E>
概述:<E>代表里面需要拿一个可用类型
用处:限定集合存储数据的类型,子类可以存储数据到前列集合。
作用:提高安全性。
泛型的好处:
1.提高安全性(将运行期错误转到编译期,如果不设置泛型,可能会出现classcastException类型转换异常)
2.省去了强转的麻烦
package com.demo.cn;
import java.util.ArrayList;
import java.util.Iterator;
public class Demo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Student> s=new ArrayList<Student>();
s.add(new Student("张三",23));
Iterator<Student> i=s.iterator();
Student m=i.next();
System.out.println(m.getName()+" "+m.getAge());
}
}
泛型方法的使用
定义格式:
public <泛型类型> 返回类型 方法名 (泛型类型 遍历名)
非静态方法
public <T> void show(Tt){};
静态方法
public static<T> void show(T t){};
泛型接口的使用
概述:把泛型定义在接口上
定义格式:public interface 接口名<泛型类型>
1.接口里参数类型随着接口的类型一致
2.接口类型随着方法定义的泛型。
实现类也要定义泛型。
package com.demo.cn;
public class Demo3_Test<T> implements Demo3<T> {
@Override
public void show(T t) {
// TODO Auto-generated method stub
}
@Override
public<Q> void print(Q q) {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
Demo3_Test<String> d3=new Demo3_Test<String>();
d3.show("abc");
d3.print(100);
}
}
package com.demo.cn;
public interface Demo3<T> {
public void show(T t);
public<Q> void print(Q q);
}
泛型高级之通配符
<?>:任意类型,没有明确就是Object以及任意java类
package com.demo.cn;
import java.util.ArrayList;
import java.util.List;
public class Demo4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<?> l=new ArrayList<String>();//?默认是后面的类型
}
}
? extends E
向下限定 E及其子类
? super E
向上限定E及其子类
addAll里的功能是把子类给到父类
父类.addAll(子类);
package com.demo.cn;
import java.util.Objects;
public class Person {
private String name;
private int age;
public Person() { }
public Person(String name,int age) {
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object obj) {
Person other = (Person) obj;
return this.age == other.age && Objects.equals(this.name, other.name);
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
package com.demo.cn;
import java.util.Objects;
public class Student extends Person{
public Student(String name,int age){
super(name,age);
}
}
package com.demo.cn;
import java.util.ArrayList;
import java.util.List;
public class Demo5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//向下限定
ArrayList<Person> list1=new ArrayList<Person>();
list1.add(new Person("张三",23));
list1.add(new Person("李四",24));
list1.add(new Person("王五",25));
list1.add(new Person("赵六",26));
ArrayList<Student> list2=new ArrayList<Student>();
list1.add(new Person("张三1",23));
list1.add(new Person("李四1",24));
list1.add(new Person("王五1",25));
list1.add(new Person("赵六1",26));
list1.addAll(list2);
//list2.addAll(list1);
System.out.println(list1);
}
}
}