java泛型程序设计——泛型类的静态上下文中类型变量无效+不能抛出或捕获泛型类的实例
生活随笔
收集整理的這篇文章主要介紹了
java泛型程序设计——泛型类的静态上下文中类型变量无效+不能抛出或捕获泛型类的实例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】README
0.1) 本文描述+源代碼均 轉自 core java volume 1, 旨在理解 java泛型程序設計 的 泛型類的靜態上下文中類型變量無效+不能拋出或捕獲泛型類的實例 的知識;
【1】泛型類的靜態上下文中類型變量無效
1.1)不能在靜態域或方法中引用類型變量:
public class Singleton<T> {private static T single; // ERRORprivate static getSingle() // ERROR{} }1.2)因為類型擦除后, 只剩下 Singleton 類, 它只包含一個 singleInstance 域;
【2】不能拋出或捕獲泛型類的實例
2.1)既不能拋出也不能捕獲泛型類對象。 且泛型類擴展 Throwable 也是不合法的;
如, public class Problem<T> extends Exception {} // ERROR--can't extend Throwable- 2.1.1)catch 子句中不能使用類型變量, 以下方法不能通過編譯:
- 2.1.2)不過, 在異常規范中適用類型變量是允許的,以下方法是合法的:
2.2)Java 異常處理的一個基本原則是: 必須為所有已檢查異常提供一個處理器。 不過可以利用泛型消除這個限制。 關鍵的方法如下:
@SuppressWarnings("unchecked") public static <T extends Throwable> void throwAS(Throwable e) throws T {throw (T)e; }- 2.2.1)假設以上方法包含在 類 Block中, 如果調用 Block.《RuntimeException》throwAs(t); 編譯器就會認為t 是一個未檢查異常。
- 2.2.2)以下代碼會把所有異常都轉換為 編譯器所認為的未檢查異常:
- 2.2.3)吧以上代碼添加到一個抽象類中。 用戶可以覆蓋body 方法來提供一個具體的動作。 調用toThread 時, 會得到Thread類的一個對象, 它的run 方法不會介意已檢查異常;
2.3)看個荔枝: 以下程序運行了一個線程, 它會拋出一個 已檢查 的異常;
public class Test {public static void main(String[] args){new Block(){public void body() throws Exception{Scanner in = new Scanner(new File("ququqx"));while(in.hasNext())System.Out.println(in.next());}}.toThread().start();} }- 2.3.1)運行這個程序, 會得到一個 棧軌跡;
- 2.3.2)這有什么意義呢 ? 正常情況下, 你必須捕獲線程run方法中的所有已檢查異常, 把它們包裝到 未檢查異常中, 因為run方法聲明為 不拋出 任何已檢查異常;
- 2.3.3)不過在這里, 我們并沒有做這種包裝。 我們只是拋出異常, 并哄騙編譯器,讓它認為這不是已檢查異常;
Conclusion)通過使用泛型類, 擦除和 @SuppressWarnings 標注, 就能消除 java 類型系統的部分基本限制;
總結
以上是生活随笔為你收集整理的java泛型程序设计——泛型类的静态上下文中类型变量无效+不能抛出或捕获泛型类的实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优酷优酷下载优酷视频播放器官方下载电脑版
- 下一篇: 石楠花什么味道(为什么味道难闻还是要种植