一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

服務器之家 - 編程語言 - Java教程 - Java源碼解析之TypeVariable詳解

Java源碼解析之TypeVariable詳解

2021-01-25 11:42青樓有罪 Java教程

這篇文章主要介紹了Java源碼解析之TypeVariable詳解,具有一定參考價值,需要的朋友可以了解下。

TypeVariable,類型變量,描述類型,表示泛指任意或相關一類類型,也可以說狹義上的泛型(泛指某一類類型),一般用大寫字母作為變量,比如K、V、E等。

源碼

java" id="highlighter_84184">
?
1
2
3
4
5
6
7
8
public interface TypeVariable<D extends GenericDeclaration> extends Type {
  //獲得泛型的上限,若未明確聲明上邊界則默認為Object
  Type[] getBounds();
  //獲取聲明該類型變量實體(即獲得類、方法或構造器名)
  D getGenericDeclaration();
  //獲得名稱,即K、V、E之類名稱
  String getName();
}

概述

  說到TypeVariable<D>就不得不提起java泛型中另一個比較重要的接口對象,GenericDeclaration接口對象。該接口用來定義哪些對象上是可以聲明(定義)范型變量,所謂范型變量就是<E extends List>或者<E>, 也就是TypeVariable<D>這個接口的對應的對象,TypeVariable<D>中的D是extends GenericDeclaration的,用來通過范型變量反向獲取擁有這個變量的GenericDeclaration。

  目前實現GenericDeclaration接口的類包括Class, Method, Constructor,也就是說只能在這幾種對象上進行范型變量的聲明(定義)。GenericDeclaration的接口方法getTypeParameters用來逐個獲取該GenericDeclaration的范型變量聲明。詳情可查看:Java源碼解析之GenericDeclaration詳解

  類型變量的聲明(定義):<E>,前后需加上尖括號

?
1
2
3
4
5
6
7
8
9
10
11
//1.在類(Class)上聲明(定義)類型變量
class A<T>{
  T a;
}//之后這里可用任意類型替換T,例如
A<String> as = new A<String>();
//是否看著有點像集合?不錯,集合就是泛型的一個典型運用
//2.在方法上聲明(定義)
public <E> void test(E e){}
//方法上,類型變量聲明(定義)不是在參數里邊,而且必須在返回值之前,static等修飾后
//3.聲明(定義)在構造器上
public <K> A(K k){}

【注意】類型變量聲明(定義)的時候不能有下限(既不能有super),否則編譯報錯。為什么?T extends classA表示泛型有上限classA,當然可以,因為這樣,每一個傳進來的類型必定是classA(具有classA的一切屬性和方法),但若是T super classA,傳進來的類型不一定具有classA的屬性和方法,當然就不適用于泛型,說的具體點:

?
1
2
3
4
5
6
7
8
//假設
class A<T super classA>{
  T t;
  public void test(){
    //這個時候你不能用t干任何事,因為你不確定t具有哪些屬性和方法
    //當然,t肯定是有Object方法的,但沒意義
  }
}

源碼詳解

1.getBounds

  獲得該類型變量的上限(上邊界),若無顯式定義(extends),默認為Object,類型變量的上限可能不止一個,因為可以用&符號限定多個(這其中有且只能有一個為類或抽象類,且必須放在extends后的第一個,即若有多個上邊界,則第一個&后必為接口)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class A<K extends classA & interfaceB, V>{
  K key;
  V value;
  public static void main(String[] args) throws Exception
  {
    Type[] types = Main.class.getTypeParameters();
    for(Type type : types){
      TypeVariable t = (TypeVariable)type;
      System.out.println(t.getGenericDeclaration());
      int size = t.getBounds().length;
      System.out.println(t.getBounds()[size - 1]);
      System.out.println(t.getName() + "\n-------------分割線-------------");
    }
  }
}
//輸出結果
class com.fcc.test.Main
interface com.fcc.test.interfaceB
K
-------------分割線-------------
class com.fcc.test.Main
class java.lang.Object
V
-------------分割線-------------

2.getGenericDeclaration

  獲得聲明(定義)這個類型變量的類型及名稱,即如:

class com.xxx.xxx.classA 或
public void com.fcc.test.Main.test(java.util.List) 或
public com.fcc.test.Main()

?
1
2
3
4
Constructor constructor = Main.class.getConstructor();
TypeVariable typeVariable = constructor.getTypeParameters()[0];
System.out.println(typeVariable.getGenericDeclaration());
//獲得方法中聲明(定義)的類型變量與上面類似

3.getName

  獲得這個類型變量在聲明(定義)時候的名稱

總結

以上就是本文關于Java源碼解析之TypeVariable詳解的全部內容,希望對大家有所幫助。歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://blog.csdn.net/a327369238/article/details/52673338

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.尤物视频| 四虎在线播放 | caoporn超碰 | 女仆色网址| 亚洲精品第二页 | 色菇凉天天综合网 | 波多野结在线观看 | 亚洲精品电影天堂网 | 69欧美性猛交| 久久一本岛在免费线观看2020 | 国产中文字幕 | 色综合中文字幕在线亚洲 | 奇米影视在线视频 | 小苹果日本在线观看 | 亚洲 欧美 国产 综合久久 | free性日本| www.伊人| 深夜在线观看 | 国产精品aⅴ| 国内精品九一在线播放 | 暖暖免费观看高清在线 | 国产午夜精品一区二区三区 | 美女黑人做受xxxxxⅹ | 乌克兰肛交影视 | 挺进白嫩老师下面视频 | 四虎精品视频在线永久免费观看 | 日本免费三片在线播放 | 欧美日本道免费一区二区三区 | 毛片免费毛片一级jjj毛片 | 亚洲高清在线视频 | 日韩一区二区三区在线 | 国内视频一区二区三区 | 国产精品秒播无毒不卡 | a天堂视频| 免费人成网址在线观看国内 | 91探花在线播放 | 成人精品视频 成人影院 | 波多野结衣xxxx性精品 | 69成人网| 国产伦精品一区二区三区免费观看 | 久久热在线视频精品1 |