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

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

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

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泛型 类型变量的限定的更多相关文章

  1. Java泛型之自限定类型

    在<Java编程思想>中关于泛型的讲解中,提到了自限定类型: class SelfBounded<T extends SelfBounded<T>> 作者说道: 这 ...

  2. Java泛型通配符以及限定

    摘抄笔记 A:泛型的限定 /* * 将的酒店员工,厨师,服务员,经理,分别存储到3个集合中 * 定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法 */ import java.uti ...

  3. Java 泛型 泛型代码和虚拟机

    Java 泛型 泛型代码和虚拟机 @author ixenos 类型擦除.原始类型.给JVM的指令.桥方法.Java泛型转换的事实 l  类型擦除(type erasure) n  Java泛型的处理 ...

  4. java 泛型基础问题汇总

    泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引 ...

  5. Java泛型主题讨论

    说明:在学习泛型这一知识点中,主要参考自<疯狂Java讲义>第7章P307-P330的泛型内容,因为是跳着阅读,所以前面的一些名词不是特别清楚,这里也做出适当备注,供自己识记与理解. 1. ...

  6. Java泛型总结---基本用法,类型限定,通配符,类型擦除

    一.基本概念和用法 在Java语言处于还没有出现泛型的版本时,只能通过Object是所有类型的父类和类型强制转换两个特点的配合来实现类型泛化.例如在哈希表的存取中,JDK1.5之前使用HashMap的 ...

  7. Java泛型解析(02):通配符限定

    Java泛型解析(02):通配符限定      考虑一个这种场景.计算数组中的最大元素. [code01] public class ArrayUtil { public static <T&g ...

  8. JAVA 泛型 通配符? extends super限定,实例区分extends super限定的作用用法

    java泛型中的关键字 ? 表示通配符类型 <? extends T> 既然是extends,就是表示泛型参数类型的上界,说明参数的类型应该是T或者T的子类. <? super T& ...

  9. 浅析Java 泛型

    泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...

随机推荐

  1. 【bzoj3251】树上三角形 朴素LCA+暴力

    题目描述 给定一大小为n的有点权树,每次询问一对点(u,v),问是否能在u到v的简单路径上取三个点权,以这三个权值为边长构成一个三角形.同时还支持单点修改. 输入 第一行两个整数n.q表示树的点数和操 ...

  2. 【bzoj1941】[Sdoi2010]Hide and Seek KD-tree

    题目描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏---捉迷藏. ...

  3. ubuntu安装mysql<服务器>

    服务器 阿里云服务器Ubuntu安装mysql 2014-08-22 21:52 |  coding云 |  7315次阅读 | 11条评论   这里首先吐槽一下阿里云,我作为公司的唯一懂服务器架设的 ...

  4. input和textarea区别

    1. input是单行文本,textarea是多行文本,可以带滚动条2. input的value放在标签里面 <input type="text" value="b ...

  5. Eclipse + Apache Axis2 发布RESTful WebService(三)第一个程序Hello Axis2 !(未成功)

    此路不通 Axis2发布SOAP WebService非常简单,建一个Dynamic Web Project,然后为它建一个Axis的Web Service(Tomcat7+JDK),就会生成Clas ...

  6. Java面试题之红黑树原理

    红黑树原理: 每个节点都只能是红色或黑色的: 根节点是黑色的: 每个叶节点(空节点)是黑色的: 如果一个节点是红色的,那么他的子节点都是黑色的: 从任意一个节点到其每个子节点的路径都有相同数目的黑色节 ...

  7. Docker 通俗易懂的入门

    这篇转的文章讲的通俗易懂,算个入门的东西了- 转自:http://www.csdn.net/article/2014-07-02/2820497-what's-docker 尽管之前久闻Docker的 ...

  8. es6总结(八)--模块化-import

  9. hdu 4941 2014 Multi-University Training Contest 7 1007

    Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  10. C语言集锦(二) 图像显示 Windows和Linux

    关于图像显示有很多库可以用,Windows下有GDI,GDI+,D3D等,Linux下有X Window和Wayland,此外还有OpenGL ,SDL等图形库以及各种GUI库. 了解最原始的方式,对 ...