1. 当我们希望对泛型的类型参数的类型进行限制的时候(好拗口), 我们就应该使用有界类型参数(Bounded Type Parameters). 有界类型参数使用extends关键字后面接上边界类型来表示, 注意: 这里虽然用的是extends关键字, 却不仅限于继承了父类E的子类, 也可以代指显现了接口E的类. 仍以Box类为例:

 public class Box<T> {

     private T obj;

     public Box() {}

     public T getObj() {
return obj;
} public void setObj(T obj) {
this.obj = obj;
} public Box(T obj) {
super();
this.obj = obj;
} public <Q extends Number> void inspect(Q q) {
System.out.println(obj.getClass().getName());
System.out.println(q.getClass().getName());
}
}

我加入了public <Q extends Number> void inspect(Q q){...}方法, 该方法的泛型只能是Number的子类.

 Box<String> b = new Box<>();
b.setObj("Hello");
b.inspect(12);
b.inspect(1.5);
// b.inspect(true); // 编译出错

2. 界类型参数除了规定泛型的范围之外, 还允许我们调用边界类型所拥有的方法(因为所有类型参数都是边界类型或边界类型的子类), 如:

 public class NatureNumber<T extends Integer> {

     private T t;

     public Box() {}

     public NatureNumber(T t) {
this.t = t;
} public boolean isEven() {
return t.intValue() % 2 == 0;
} // ...
}

3. 多边界:

上面的例子展示的是单边界的泛型, 我们还可以使用多边界泛型:
  <T extends A & B & C>
但是多边界使用时其实只能继承一个父类, 并且要将他写在第一个位置上. 其他的都是其实现的接口, 如:

 class A { /* ... */ }
interface B { /* ... */ }
interface C { /* ... */ }
class D <T extends A & B & C> { /* ... */ }

如果A不在第一个位置上就会编译出错.

Java泛型学习笔记 - (四)有界类型参数的更多相关文章

  1. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

  2. Java IO学习笔记四:Socket基础

    作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...

  3. Java泛型学习笔记 - (七)浅析泛型中通配符的使用

    一.基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List< ...

  4. Java泛型学习笔记

    泛型是Java5引进的新特征,是类和接口的一种拓展机制,主要实现参数化类型机制.Java的泛型,跟C++的类模板有很多相似的地方,或者说,就是C++类模板的升级版. 泛型类 在开发过程中,我们或许要设 ...

  5. Java泛型学习笔记--Java泛型和C#泛型比较学习(一)

    总结Java的泛型前,先简单的介绍下C#的泛型,通过对比,比较学习Java泛型的目的和设计意图.C#泛型是C#语言2.0和通用语言运行时(CLR)同时支持的一个特性(这一点是导致C#泛型和Java泛型 ...

  6. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

  7. Java基础学习笔记(四) - 认识final关键字、权限修饰符和内部类

    一.final关键字 为什么要使用 final 关键字? 通过继承我们知道,子类可以重写父类的成员变量和方法.final 关键字可以用于修饰父类,父类成员变量和方法,使其内容不可以被更改. 1.被修饰 ...

  8. Java泛型学习笔记 - (六)泛型的继承

    在学习继承的时候, 我们已经知道可以将一个子类的对象赋值给其父类的对象, 也就是父类引用指向子类对象, 如: Object obj = new Integer(10); 这其实就是面向对象编程中的is ...

  9. Java泛型学习笔记 - (三)泛型方法

    泛型方法其实和泛型类差不多, 就是把泛型定义在方法上, 格式大概就是: public <类型参数> 返回类型 方法名(泛型类型 变量名) {...}泛型方法又分为动态方法和静态方法,:1. ...

随机推荐

  1. 进fastreboot

    1.红米1s 关机后,开机键+音量键下 同时按 2.红米note 关机后,开机键+音量键上 同时按 3. 4. 5.

  2. oracle 存储过程创建及执行简单实例

    1. 创建 CREATE OR REPLACE PROCEDURE getAplage(eNo IN NUMBER,salary OUT NUMBER) AS BEGIN SELECT AplAge ...

  3. Android NDK 项目依赖简单示例

    目录文件结构如图, 进入main目录执行命令 .ndkbuild NDK_MODULE_PATH=../ 说明 .ndkbuild请替换成有效的ndk-build的命令 所有文件下载 http://p ...

  4. [HTML/JS] JQuery 页面滚动回到顶部

    HTML: <html> <body> <div id="back-to-top" style="cursor:pointer; displ ...

  5. MySql 获取当前节点及递归所有上级节点

    -- MySql 获取当前节点及递归所有上级节点 -- 参数说明:resultField:查询返回字段,idd 要查询的资源ID值,idFieldName ID字段名,parentIdFieldNam ...

  6. background复合属性详解(上):background-image

    background复合属性是个很复杂的属性,花样非常多,比较神奇的是css3 中支持多图片背景了,这篇文章先讲讲background-image属性,其他背景属性会在后续的文章综合总结. 一.最基本 ...

  7. CSS3回执特殊图形

  8. JavaEE Hibernate初级概念

    1.  Hibernate 是连接Java应用程序和关系数据库的中间件: 对JDBC API进行了封装.负责Java对象的持久化: 在三层软件架构中它位于持久层(数据访问层),封装了所有数据访问细节, ...

  9. iOS_线程和进程的区别与联系

    首先是线程和进程的联系: 线程和进程都是由操作系统所负责的程序运行的基本单元,系统利用该基本单元实现对应用的并发性. 接下来就是线程和进程的区别: 线程和进程最大的区别就是它们是操作系统的两种资源管理 ...

  10. Git & GitHub

    使用 Git 和 GitHub 有一段时间了,总结下经验. 起初接触 Git 是先遇到 GitHub 的,当时傻傻分不清这两者的区别,毕竟名字都那么像,刚开始只想用酷酷的方法 clone 代码(SSH ...