1. 程式人生 > >Java泛型 類型變量的限定

Java泛型 類型變量的限定

main rri track super() 必須 type ride his method

有時候,類和方法須要對類型變量加以約束。比方你有一個方法,你僅僅希望它接收某個特定類型及其子類型作為參數。

以下就舉一個方法限定接收參數的類型的樣例來說明怎樣限定類型變量。

首先有幾個簡單的輔助類:

package generic;

public class Person extends Animal {
	private String name;

	public Person(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + "]";
	}
}

package generic;

public class Student extends Person {
	private String studentNumber;

	public Student(String name, String registrationNumber) {
		super(name);
		this.studentNumber = registrationNumber;
	}

	public String getStudentNumber() {
		return studentNumber;
	}

	public void setStudentNumber(String studentNumber) {
		this.studentNumber = studentNumber;
	}

	@Override
	public String toString() {
		return "Student [studentNumber=" + studentNumber + ", name="
				+ getName() + "]";
	}

	
	
}

package generic;

public class Teacher extends Person {
	private String teacherNumber;

	public Teacher(String name, String teacherNumber) {
		super(name);
		// TODO Auto-generated constructor stub
		this.teacherNumber = teacherNumber;
	}

	public String getTeacherNumber() {
		return teacherNumber;
	}

	public void setTeacherNumber(String teacherNumber) {
		this.teacherNumber = teacherNumber;
	}

	@Override
	public String toString() {
		return "Teacher [teacherNumber=" + teacherNumber + ", name="
				+ getName() + "]";
	}


	
}

以下是一個測試類,裏面包括了一個限定了接收參數的類型的方法:

package generic;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person person = new Person("li");
		Student student = new Student("yuncong", "1");
		Teacher teacher = new Teacher("wangfang", "99");
		Building building = new Building("qiuyuan");
		// test1
		/**
		 * test1說明getPersonInfo(T person)方法的參數僅僅能是Person
		 * 及其子類的實例;
		 */
		System.out.println(Test.getPersonInfo(person));
		System.out.println(Test.getPersonInfo(student));
		System.out.println(Test.getPersonInfo(teacher));
		/**
		 * Bound mismatch: The generic method getPersonInfo(T) of type Test is
		 * not applicable for the arguments (Building). The inferred type
		 * Building is not a valid substitute for the bounded parameter <T
		 * extends Person>
		 */
		// System.out.println(Test.getPersonInfo(building));// error
	}

       / **
	 * T的限定類型決定了在方法中能夠調用T的實例的哪些方法。
	 * 
	 * @param person
	 * @return
	 */
	public static <T extends Person> String getPersonInfo(T t) {
		return t.toString();
	}
}
執行測試類的結果例如以下:

Person [name=li]
Student [studentNumber=1, name=yuncong]
Teacher [teacherNumber=99, name=wangfang]

類型變量的限定僅僅有extends這一個keyword,extends能夠接多個接口超類型,可是至多有一個類,假設extends後面跟有類,這個類必須是第一個。多個限定類型用&隔開。

如:T extends Person & Comparable<T>。


Java泛型 類型變量的限定