激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 淺談Java泛型讓聲明方法返回子類型的方法

淺談Java泛型讓聲明方法返回子類型的方法

2020-08-16 14:36java教程網 Java教程

下面小編就為大家帶來一篇淺談Java泛型讓聲明方法返回子類型的方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

泛型典型的使用場景是集合??紤]到大多數情況下集合是同質的(同一類型),通過聲明參數類型,可免去類型轉換的麻煩。本文將討論本人閱讀Spring Security源碼時遇到的一個關于泛型遞歸模式的問題。

聲明方法返回子類型

在Spring Security的源碼里有一個ProviderManagerBuilder接口,聲明如下

?
1
2
3
public interface ProviderManagerBuilder<B extends ProviderManagerBuilder<B>> extends SecurityBuilder<AuthenticationManager> {
  B authenticationProvider(AuthenticationProvider authenticationProvider);
}

其實現類AuthenticationManagerBuilder

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class AuthenticationManagerBuilder extends AbstractConfiguredSecurityBuilder<AuthenticationManager, AuthenticationManagerBuilder> implements ProviderManagerBuilder<AuthenticationManagerBuilder> {
 
  //...
 
  public AuthenticationManagerBuilder authenticationProvider(
    AuthenticationProvider authenticationProvider) {
    this.authenticationProviders.add(authenticationProvider);
    return this;
  }
 
  //...
 
}

上面有很多干擾項,我們來簡化一下

接口A定義如下

?
1
2
3
4
5
public interface A<T extends A<T>> {
 
  T add();
 
}

說明:A接口只有一個add方法,返回泛型T。T的聲明有些饒<T extends A<T>>。

A接口的實現類B

?
1
2
3
4
5
6
7
8
public class B implements A<B> {
 
  @Override
  public B add() {
    return null;
  }
 
}

注意,此處類B里的add方法返回類型B。也就是說,接口A里聲明的方法時并不知道子類型B的存在,通過繼承和泛型,可以放返回值動態的適配子類型,這一切都要歸功于<T extends A<T>>

泛型遞歸模式(Recurring Generic Pattern)

?
1
2
3
4
5
6
public interface A
 
public abstract class Enum<E extends Enum<E>>
  implements Comparable<E>, Serializable {
  //...
}

java所有的枚舉類型都隱式的繼承java.lang.Enum,不允許通過現實的繼承聲明枚舉類型,甚至集成java.lang.Enum也是編譯器所不允許的。

假設有一個枚舉類StatusCode,其等價的聲明如下

public class StatusCode extends Enum<StatusCode>

現在我們來驗證一下泛型約束,

1. 因為Enum<StatusCode>,所以E=StatusCode;

2. 根據<E extend Enum<E>> 和 E=StatusCode 可得,<StatusCode extend  Enum<StatusCode>>;

3. 由于public class StatusCode extends Enum<StatusCode>第二步的結論顯然成立。

為什么Enum的聲明這么繞?直接Enum不行么?

因為Enum<E>實現了Comparable< E>接口,該接口有一個compareTo方法

public int compareTo(E o) {}

 <E extend Enum> 強制約束了進行`compareTo`的調用對象類型和參數類型都嚴格一致,不會出現子類和超類或者兄弟類之間的比較。

泛型遞歸模式與繼承

泛型遞歸模式interface A<T extend A<T>>用于約束參數類型T,要求其為類型A的子類。

考慮到繼承和實現B implements A< B>,參數類型和實體類型是一致的。這樣類A中方法簽名里涉及到參數類型T的地方,在實現類里會為實現類本身,這讓類型系統更加的嚴謹。

以上這篇淺談Java泛型讓聲明方法返回子類型的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 万圣街在线观看免费完整版 | 欧美三级日本三级少妇99 | 久久精品一区二区三区四区五区 | 欧美亚洲国产一区 | 中文字幕综合在线观看 | 国产一国产精品一级毛片 | 色人久久| 欧美成人二区 | 日本黄色免费观看视频 | 鲁久久| 一区播放| 国内精品久久久久久久影视红豆 | 日韩三级伦理在线观看 | 国产精品免费一区二区三区都可以 | 亚洲特黄a级毛片在线播放 久久久入口 | 欧美一级黄色片在线观看 | 九九热在线视频免费观看 | 欧美一极视频 | 精品一区二区在线观看 | 国内精品伊人久久 | 欧美国产日韩在线 | 国产精品午夜一区 | 在线成人免费观看 | 亚洲码无人客一区二区三区 | 国产超碰人人爽人人做人人爱 | 成人免费久久 | 国产三级精品最新在线 | 久草影音| 日韩中文字幕一区二区三区 | 中文字幕在线播放视频 | 九九热在线免费观看视频 | 成人做爰www免费看 成人午夜视频免费看 | 亚洲福利在线视频 | 看国产一级毛片 | 久久99精品久久久久久园产越南 | 好吊色欧美一区二区三区四区 | 色视频一区二区 | 成年免费视频黄网站在线观看 | 第一区免费在线观看 | 少妇一级淫片免费放正片 | 久久精品com |