欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java泛型之自限定类型

程序员文章站 2022-06-19 19:14:01
在《Java编程思想》中关于泛型的讲解中,提到了自限定类型: 作者说道: 这就像两面镜子彼此照向对方所引起的目眩效果一样,是一种无限反射。 类接受泛型参数 ,而 由一个边界限定,这个边界就是拥有T作为其参数的 接下来,作者用了近3页的纸来进行解释这个问题,且语言极其晦涩难懂(可能是翻译的问题),但是 ......

在《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编程思想》这本书,我的个人理解:

  1. 对新手肯定是极不友好的,可能是翻译的问题,语言上稍显晦涩;
  2. 书名就《java编程思想》,英文名为《thinking in java》,讲的就思想这个层面的事情,,不能以常理视之,作者的很多语言,似乎是在解决java语言的设计思想和问题等,而且在做这种讲解时,说明如何使用和注意事项等不在作者的考虑范围内,如果想知道这些,建议直接参考《java核心技术卷》.
  3. 虽说java与c++有极其深的渊源,甚至可以称java为c++—--,但毕竟是两门语言.作者经常性的从c++开始说起,在c++的基础上讲java,实在是让人费解.如果给这本书改个名字的话,参考网友所言:《thinking java in c++》.