1.注意点
结合第十一章集合的内容阅读
- JDK5.0后推出了泛型,泛型只在编译阶段起作用,给编译器参考
- 使用泛型的好处:集合中存储的元素类型统一了;从集合中取出的元素类型是泛型指定的类型,不需要大量的向下转型
- 适用泛型的缺点:导致集合中的元素缺乏多样性,但是的多数业务中,集合中元素的类型还是统一的
2.泛型的使用
public class Animal{
public void move(){
System,out.println("动物在移动");
}
}
class Cat extends Animal{
public void main catchMouse(){
System.out.println("猫抓老鼠");
}
}
class Bird extends Animal{
public void fly(){
System.out.println("鸟在飞");
}
}
public class Test{
public static void main(String[] args){
List<Animal> myList = new ArrayList<Animal>();
//使用泛型List<Animal>后,表示List集合中只允许存储Animal类型的数据
Cat c = new Cat();
Bird b = new Bird();
myList.add(a);
myList.add(b);
Iterator<Animal> it = myList.iterator();
//这个表示迭代器迭代的是Animal类型的
while(it.hasNext()){
Animal a = it.next();
//每一次迭代返回的数据都是Animal类型的
//a.move();
//调用子类特有的方法还是需要向下转型
if(a instanceof Cat){
Cat x = (Cat)a;
x.catchMouse();
}
if(a instanceof Bird){
Bird y = (Bird)a;
y.fly();
}
}
}
}
3.自动类型推断机制
JDK8后引入,又称为钻石表达式
public class Test{
public static void main(String[] args){
List<Animal> myList = new ArrayList<>();
//ArrayList<这里的类型自动推断>
myList.add(new Animal());
myList.add(new Cat());
Iterator<Animal> it = myList.iterator();
while(it.hasNext()){
Animal a = it.next();
a.move();
}
}
4.自定义泛型
自定义泛型是,<>中的是一个标识符,可以自定义
java源代码中经常出现的是:
- ,E是Element单词的首字母
- ,T是Type单词的首字母
public class MyIterator<E>{
public void doSome(E o){
System.out.prinln(o);
}
public static void main(String[] args){
MyIterator<String> m = new MyIterator<>();
//new 对象时指定泛型为String类型
m.doSome("abc");
//m.oSome(100); 类型不匹配
}
}
class MyIterator<T>{
public T get(){
return null;
}
public static void main(String[] args){
MyIterator<String> m1 = new MyIterator<>();
String s1 = m1.get();
MyIterator<Animal> m2 = new MyIterator<>();
Animal s2 = m2.get();
}
}