Skip to content

Latest commit

 

History

History
114 lines (83 loc) · 2.36 KB

泛型限定.md

File metadata and controls

114 lines (83 loc) · 2.36 KB

泛型限定

作用

  • 可以對類型進行限定 上限 --> ? extends E: 接收 E 類型或者 E 類型的子類對象 下限 --> ? super E: 接收 E 類型或者 E 的父類型
  • 一般在存儲元素的時候都是用上限,因為這樣取出都是按照上限類型來運算的,不會出現類型安全隱患。

演示

泛型的上限

public class GenericStudent extends GenericPerson {

	public GenericStudent() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public GenericStudent(String name, int age) {
		
		super(name, age);
	}
	
	public String toString() {
		
		return "Student: " + getName() + " @ " + getAge();
	}
}

public class GenericWorker extends GenericPerson {

	public GenericWorker() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public GenericWorker(String name, int age) {
		
		super(name, age);
	}
	
	public String toString() {
		
		return "Worker: " + getName() + " @ " + getAge();
	}
}

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class GenericAdvanceDemo {

	public static void main(String[] args) {

		ArrayList<GenericStudent> al = new ArrayList<>();
		
		al.add(new GenericStudent("Jack", 20));
		al.add(new GenericStudent("Vivian", 30));
		al.add(new GenericStudent("Mike", 40));
		
		ArrayList<GenericWorker> al2 = new ArrayList<>();
		
		al2.add(new GenericWorker("Jervis", 10));
		al2.add(new GenericWorker("Jacky", 20));
		al2.add(new GenericWorker("Eric", 30));
		
		/*
		ArrayList<String> al3 = new ArrayList<>();
		
		al3.add("abc1");
		al3.add("abc2");
		al3.add("abc3");		
		*/
		
		printCollection(al);
		printCollection(al2);
//		printCollection(al3);//編譯失敗
	}
	
	//迭代並打印集合中的元素
	public static void printCollection(Collection<? extends GenericPerson> al) {//泛型的限定
		
		Iterator<? extends GenericPerson> it = al.iterator();
		
		while(it.hasNext()) {
			
			GenericPerson p = it.next();//已限定泛型
			
			System.out.println(p.getName() + " @ " + p.getAge());
		}
	}
}

打印結果

Jack @ 20
Vivian @ 30
Mike @ 40
Jervis @ 10
Jacky @ 20
Eric @ 30

泛型的下限

public static void printCollection2(Collection<? super GenericStudent> al) {//泛型的下限
		
		Iterator<? super GenericStudent> it = al.iterator();
		
		while(it.hasNext()) {
			
			System.out.println(it.next());
		}