- 使用泛型机制:
- list中只可以放入Animal类型的对象,存入其他类型的对象会报错,集合中的元素类型更加统一了
- 使用泛型之后,每一次迭代返回的元素类型都是Animal类型。
//list中只可以放入Animal类型的对象,集合中的元素类型更加统一了
List<Animal> list = new ArrayList<Animal>();
Cat c = new Cat();
Bird b = new Bird();
Iterator<Animal> it = list.iterator();
while(it.hasNext()){
//使用泛型之后,每一次迭代返回的元素类型都是Animal类型。
Animal a = it.next();
a.move();
}
- 泛型这种语法机制,只在程序编译阶段起作用,只是给编译器参考的
- 好处:
- 集合中储存的元素类型统一
- 从集合中取出的元素都是泛型指定的类型,不需要进行大量的“向下转型”
- △可以直接通过迭代器使用指定类型的方法
- 缺点:
- 导致集合中元素缺乏多样性。
- 自动类型推断机制(又称为钻石表达式)
List<Animal> list = new ArrayList<Animal>();
—>List<Animal> list = new ArrayList<>();
- 自定义泛型
- 自定义泛型的时候,<> 尖括号中的是一个标识符,随便写。
- java源代码中经常出现的是:
<E>
和<T>
E是Element单词首字母。
T是Type单词首字母。
public class GenericTest03<标识符随便写> {
public void doSome(标识符随便写 o){
System.out.println(o);
}
public static void main(String[] args) {
// new对象的时候指定了泛型是:String类型
GenericTest03<String> gt = new GenericTest03<>();
// 类型不匹配
//gt.doSome(100);
gt.doSome("abc");
// =============================================================
GenericTest03<Integer> gt2 = new GenericTest03<>();
gt2.doSome(100);
// 类型不匹配
//gt2.doSome("abc");
MyIterator<String> mi = new MyIterator<>();
String s1 = mi.get();
MyIterator<Animal> mi2 = new MyIterator<>();
Animal a = mi2.get();
// 不用泛型就是Object类型。
/*GenericTest03 gt3 = new GenericTest03();
gt3.doSome(new Object());*/
}
}
class MyIterator<T> {
public T get(){
return null;
}
}