zoukankan      html  css  js  c++  java
  • Java泛型 类型变量的限定

    有时候,类和方法须要对类型变量加以约束。比方你有一个方法,你仅仅希望它接收某个特定类型及其子类型作为參数。

    以下就举一个方法限定接收參数的类型的样例来说明怎样限定类型变量。

    首先有几个简单的辅助类:

    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>。


  • 相关阅读:
    JBDC链接数据库
    js操作BOM对象
    打印倒正三角形
    window.onload事件
    js动态改变样式属性(className属性)
    js动态改变样式属性(style属性)
    js操作DOM对象(节点的增删改)
    easygen通用代码生成框架[开源]
    什么是真正的幸福与成功
    JVM学习笔记八:线程安全与锁优化
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7221769.html
Copyright © 2011-2022 走看看