1. 泛型是什么?
>泛型是规定一个参数的类型,举个例子引出泛型
@Test
public void test4() {
ArrayList array = new ArrayList();
array.add("张三");
array.add("李四无");
array.add(12);
// 迭代
Iterator iterator = array.iterator();
while (iterator.hasNext()) {
String s = (String) iterator.next();//为了得知字符串长度
System.out.println(s.length());
}
}
>从上面例子可以看出编译期没问题,但是在运行时就报"java.lang.ClassCastException"
也就是"类型转换异常"为什么会出现这种情况呢?因为在获取String的长度时,
集合中不只有String类型数据
在int自动装箱为Integer后强转String所以报错,
为了解决这个问题出现了"泛型"来规定集合内传入的参数
当加入泛型后"ArrayList<String> array = new ArrayList<String>();"可以看到add()
参数传入整形后就会报错,不允许添加非String类型数据,避免了异常的产生
2. 泛型==伪泛型
泛型只是在编译期规定,也就是说编译成.class文件后将没有泛型的存在
3. public class ArrayList<E>{} 类泛型
public boolean add(E e) {} 方法泛型
public interface List<E>{}
可以看到类的后面,方法参数都有一个E,其实这个E只是一个变量,怎么理解呢
当你"ArrayList<String> array = new ArrayList<String>();"那么类的泛型就会编程String,传入其他引用类型同理
"array.add("张三");"当传入String后参数E也就变成了String其他引用类型同理
4. 泛型通配符"?"
>在不知道类型的情况下尖括号内可以使用"?"来代替,但是需要注意得是尽量不要在类型不确定的情况下进行类型强制转换
5. 泛型的限定
>规定参数类型必须是XX抽象类,接口,普通类的子类或父类,否则不允许传递
>"上限限定"格式:public void iterator(ArrayList<? extends Employee> emp){} ?的类型必须是继承Employee的类型,也就是子类代码参考_5
>"下限限定"格式public void iterator(ArrayList<? super Cook> emp) {} 将关键字改为 super意为只能传入其父类
_5
import java.util.ArrayList;
import java.util.Iterator;
import org.junit.Test;
abstract class Employee {
public abstract void work(String name);
public String name;
public int age;
}
class Waiter extends Employee {
@Override
public void work(String name) {
System.out.println("服务员 " + name + " 服务");
}
public Waiter(String name, int age) {
this.name = name;
this.age = age;
}
}
class Cook extends Employee {
public Cook() {
super();
}
public Cook(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public void work(String name) {
System.out.println("厨师 " + name + " 在做饭");
}
}
public class DemoOne {
@Test
public void test1() {
ArrayList<Waiter> waiter = new ArrayList<Waiter>();
waiter.add(new Waiter("张三", 12));
iterator(waiter);// 服务员
ArrayList<Cook> cook = new ArrayList<Cook>();
cook.add(new Cook("李四", 45));
iterator(cook);// 厨师
}
public void iterator(ArrayList<? extends Employee> emp) {// 参数必须是Employee的子类,实现类
Iterator<? extends Employee> iterator = emp.iterator();
while (iterator.hasNext()) {
Employee next = iterator.next();
next.work(next.name);// 员工方法
}
}
}