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

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

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

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. ubuntu 安装tomcat<服务器>

    一.下载tomcat 可以先下载到本地,然后ftp到服务器 官方 Apache Tomcat 的下载页面(下面的链接是apache自己的镜像服务器的地址,不同网络连接的话,apache会给出不同的镜像 ...

  2. POJ——1611The Suspects(启发式并查集+邻接表)

    The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 31100 Accepted: 15110 Descri ...

  3. adb shell am命令

    adb shell am命令是在cmd命令行可以通过命令来启动Activity,Boradcast,Service等,更多使用可以参考下面附件. 比如在cmd串口我们发送广播,广播action是&qu ...

  4. 头脑王者pk答题小程序开发思路 微信pk答题小程序开发 PK答题游戏你也可以做 微信pk答题游戏

    想必大家最近的朋友圈和微信群里都被头脑王者PK答题刷屏了吧.确实很好玩,尤其是2018年的这波风口,手机答题,大家掏出手机,创建一个好友PK,然后你的好友点击进来就可以和你一起PK答题.比之前的游戏好 ...

  5. hdu 4301 dp

    Divide Chocolate Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. es6总结(七)--数据结构-Set & Map

  7. C语言中的数组的访问方式

    闲下来,写的代码,很是简单,不解释,代码如下: #include <stdio.h> int main(int argc, char **argv) { char cArray[] = & ...

  8. linux下 open fopen区别

    open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲.linxu下的fopen是open的封装函数,fopen最终还是要调用底层的系统 ...

  9. PHP 几个常用的正则表达式

    记录几个PHP中比较常用的正则. , $max_len = 20){ if (empty($username)) { return false; } $match = '/^(?![0-9]+$)[\ ...

  10. AC日记——[福利]可持久化线段树 cogs 2554

    2554. [福利]可持久化线段树 ★★☆   输入文件:longterm_segtree.in   输出文件:longterm_segtree.out   简单对比时间限制:3 s   内存限制:2 ...