在《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編程思想》這本書,我的個人理解:
- 對新手肯定是極不友好的,可能是翻譯的問題,語言上稍顯晦澀;
- 書名就《Java編程思想》,英文名為《Thinking In Java》,講的就思想這個層面的事情,,不能以常理視之,作者的很多語言,似乎是在解決Java語言的設計思想和問題等,而且在做這種講解時,說明如何使用和註意事項等不在作者的考慮範圍內,如果想知道這些,建議直接參考《Java核心技術捲》.
- 雖說Java與C++有極其深的淵源,甚至可以稱Java為
C++—--
,但畢竟是兩門語言.作者經常性的從C++開始說起,在C++的基礎上講Java,實在是讓人費解.如果給這本書改個名字的話,參考網友所言:《Thinking Java In C++》.