Java泛型学习笔记 - (四)有界类型参数
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泛型学习笔记 - (四)有界类型参数的更多相关文章
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- Java IO学习笔记四:Socket基础
作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...
- Java泛型学习笔记 - (七)浅析泛型中通配符的使用
一.基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List< ...
- Java泛型学习笔记
泛型是Java5引进的新特征,是类和接口的一种拓展机制,主要实现参数化类型机制.Java的泛型,跟C++的类模板有很多相似的地方,或者说,就是C++类模板的升级版. 泛型类 在开发过程中,我们或许要设 ...
- Java泛型学习笔记--Java泛型和C#泛型比较学习(一)
总结Java的泛型前,先简单的介绍下C#的泛型,通过对比,比较学习Java泛型的目的和设计意图.C#泛型是C#语言2.0和通用语言运行时(CLR)同时支持的一个特性(这一点是导致C#泛型和Java泛型 ...
- Java设计模式学习笔记(四) 抽象工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...
- Java基础学习笔记(四) - 认识final关键字、权限修饰符和内部类
一.final关键字 为什么要使用 final 关键字? 通过继承我们知道,子类可以重写父类的成员变量和方法.final 关键字可以用于修饰父类,父类成员变量和方法,使其内容不可以被更改. 1.被修饰 ...
- Java泛型学习笔记 - (六)泛型的继承
在学习继承的时候, 我们已经知道可以将一个子类的对象赋值给其父类的对象, 也就是父类引用指向子类对象, 如: Object obj = new Integer(10); 这其实就是面向对象编程中的is ...
- Java泛型学习笔记 - (三)泛型方法
泛型方法其实和泛型类差不多, 就是把泛型定义在方法上, 格式大概就是: public <类型参数> 返回类型 方法名(泛型类型 变量名) {...}泛型方法又分为动态方法和静态方法,:1. ...
随机推荐
- windows无法访问指定设备路径或文件。您可能没有合适的权限访问
试试退出杀毒软件试试,被杀毒软件阻拦了.
- Codeforces Round #267 (Div. 2)
A #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- svn使用
1 svn地址: svn://www.svn999.com/annie123.test12345 2 svn 账户: 账户使用时期:项目checkout时期 会提示键入用户名密码 3 新增文件 (1) ...
- Redis使用及优化入门
Redis的优势 MySQL读写慢,Redis内存数据库,读写速度快. 少量的数据要经常读写,尤其是读操作,读写速度要求高. 丰富的数据结构,Redis支持5种数据结构,MySQL字段变化,需要手动维 ...
- 【javascript】作用域和闭包浅析
作用域 分全局作用域和局部作用域 全局作用域:函数外部定义的变量,可以被整个program的各成员参照利用. 局部作用域:函数内部定义的变量,仅供该函数的各成员参照利用. var val=1; //全 ...
- 7 -- Spring的基本用法 -- 1...2
7.1 Spring简介和Spring4.0的变化 7.1.1 Spring 简介 当使用Spring框架时,必须使用Spring Core Container(即Spring容器),它代表了Spri ...
- C++中的一些小知识
判断字符是否为数字 在C/C++中有isdigit()来判断一个字符是否为数字 原型:int isdigit(char c); 用法:#include <ctype.h> (C语言):#i ...
- Spring——jar包详解(转)
Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spr ...
- 开发Blog整理
开发Blog记录 清理收藏夹 太多了,来不及看了. http://blog.sina.com.cn/s/blog_67d95f40010113ec.htmlhttp://segmentfault.co ...
- float和double的精度
作者: jillzhang 联系方式:jillzhang@126.com 原网址:http://blog.csdn.net/wuna66320/article/details/1691734 1 范围 ...