Java泛型之自限定类型
在《Java编程思想》中关于泛型的讲解中,提到了自限定类型:
class SelfBounded<T extends SelfBounded<T>>
作者说道:
这就像两面镜子彼此照向对方所引起的目眩效果一样,是一种无限反射。
SelfBounded类接受泛型参数T,而T由一个边界限定,这个边界就是拥有T作为其参数的SelfBounded
接下来,作者用了近3页的纸来进行解释这个问题,且语言极其晦涩难懂(可能是翻译的问题),但是最后给了一个非常好的例子,可破此阵:
class SelfBounded<T extends SelfBounded<T>> {}
class A extends SelfBounded<A> {}
class B extends SelfBounded<A> {}
// compile error:Type parameter 'B' is not within its bound; should extend 'SelfBounded<B>'
// 编译器已经说得很明显了,因为 class B extends SelfBounded<A> 不满足条件:T extends SelfBounded<T> ,
// 如何才能满足条件呢?将类B的定义改为class B extends SelfBounded<B>,
// 上面的 class A 和 class B 都是满足条件的,因为 class A extends SelfBounded<A>
//class D extends SelfBounded<B> {}
上面其实对书上的例子进行了一些修改,因为我们只需要这些就够了,从注释上我们就可以得到答案了.
如果想要上面class D编译通过,除了将类B的定义改为class B extends SelfBounded<B>外,还可以将SelfBounded的定义修改为:class SelfBounded<T extends SelfBounded> ,也就是把最后面的<T>去掉,这样条件就也满足了.
得出结论:
上面的粗体字就是答案,也即:,
SelfBounded类接受泛型参数T,而T由一个边界限定,这个边界就是拥有T作为其参数的SelfBounded
什么?还没看懂,那就照着上面的例子,口中默念结论,慢慢就会懂了…..
最后再说一下对于《Java编程思想》这本书,我的个人理解:
- 对新手肯定是极不友好的,可能是翻译的问题,语言上稍显晦涩;
- 书名就《Java编程思想》,英文名为《Thinking In Java》,讲的就思想这个层面的事情,,不能以常理视之,作者的很多语言,似乎是在解决Java语言的设计思想和问题等,而且在做这种讲解时,说明如何使用和注意事项等不在作者的考虑范围内,如果想知道这些,建议直接参考《Java核心技术卷》.
- 虽说Java与C++有极其深的渊源,甚至可以称Java为
C++—--,但毕竟是两门语言.作者经常性的从C++开始说起,在C++的基础上讲Java,实在是让人费解.如果给这本书改个名字的话,参考网友所言:《Thinking Java In C++》.
Java泛型之自限定类型的更多相关文章
- Java 泛型,你了解类型擦除吗?
泛型,一个孤独的守门者. 大家可能会有疑问,我为什么叫做泛型是一个守门者.这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇.泛型是 Java 中一个很小巧的概念,但 ...
- JAVA泛型中的有界类型(extends super)(转)
JDK1.5中引入了泛型(Generic)机制.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Ja ...
- Java泛型(11):潜在类型机制
泛型的目标之一就是能够编写尽可能广泛应用的代码. 为了实现这一点,我们需要各种途径来放松对我们的代码将要作用的类型所做的限制,同时不丢失静态类型检查的好处.即写出更加泛化的代码. Java泛型看起来是 ...
- Java泛型 类型变量的限定
有时候,类和方法须要对类型变量加以约束.比方你有一个方法,你仅仅希望它接收某个特定类型及其子类型作为參数. 以下就举一个方法限定接收參数的类型的样例来说明怎样限定类型变量. 首先有几个简单的辅助类: ...
- 关于JAVA泛型中的通配符类型
之前对JAVA一知半解时就拿起weiss的数据结构开始看,大部分数据结构实现都是采取通配符的思想,好处不言而喻. 首先建立两个类employee和manager,继承关系如下.其次Pair类是一个简单 ...
- Java泛型通配符以及限定
摘抄笔记 A:泛型的限定 /* * 将的酒店员工,厨师,服务员,经理,分别存储到3个集合中 * 定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法 */ import java.uti ...
- java泛型-自定义泛型方法与类型推断总结
下面是自定义泛型方法的练习: package com.mari.generic; import java.util.ArrayList; import java.util.Collection; im ...
- Java学习笔记(二一)——Java 泛型
[前面的话] 最近脸好干,掉皮,需要买点化妆品了. Java泛型好好学习一下. [定义] 一.泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个 ...
- Java泛型 通配符? extends与super
Java 泛型 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 <? super T> 表示类型下界(Java ...
随机推荐
- CentOS7攻克日记(二) —— 配置初始化及网络配置
reboot之后到达这个页面,点击第一个进去同意一下协议之后Done,然后点击右下角的FINISH
- npm --save-dev --save | -D -S区别
-S就是--save的简写,就行npm默认一个start的字段,你可以不必输入npm run start 而只需输入npm start,这两个效果是一样的.-D就是--save-dev 这样安装的包的 ...
- NetSec2019 20165327 exp1+ 逆向进阶
NetSec2019 20165327 exp1+ 一.实验内容介绍 第一个实践是在非常简单的一个预设条件下完成的: (1)关闭堆栈保护 (2)关闭堆栈执行保护 (3)关闭地址随机化 (4)在x32环 ...
- jmeter系列-如何实现像loadrunner一样,多个并发用户先通过登录初始化,然后做并发的接口性能压测
自动转开发后,就很少关注性能测试方面的东西,最近在帮朋友做一个性能压测,由于朋友那边的公司比较小,环境比较简单,而且是对http服务进行的压测,所以最终 选用了jmeter来实现这个压测. 如下就是我 ...
- 关于requestAnimationFrame与setInterval的一点差异
requestAnimationFrame与setInterval都可以实现循环触发事件,但是setInterval是基于时间的,而requestAnimationFrame是基于帧数的,在我的一次开 ...
- Python turtle学习笔记
1介绍 Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而 ...
- vue2.0配置路由
配置路由之前,先检查vue版本,(案例适用vue2.0) 采用npm包的形式进行安装. 安装路由依赖:npm install vue-router(代码中,如果在一个模块化工程中使用它,必须要通过 V ...
- 爬虫(九)scrapy框架简介和基础应用
概要 scrapy框架介绍 环境安装 基础使用 一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能 ...
- 与WCAG相关的一些学习心得
1.什么是 WCAG? WCAG全称Web Content Accessibility Guidelines 网页内容无障碍浏览准则,简单的说就是为了方便残障人士(包括低视患者,盲人,聋人,学习障碍, ...
- SQL基本介绍
SQL学习资料来源:http://www.w3school.com.cn/sql/index.asp SQL 是用于访问和处理数据库的标准的计算机语言. 什么是 SQL?SQL 指结构化查询语言SQL ...