日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java泛型程序设计——泛型类的静态上下文中类型变量无效+不能抛出或捕获泛型类的实例

發布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 子句中不能使用類型變量, 以下方法不能通過編譯:
public static <T extends Throwable> void dowork(Class<T> t) {...catch(T e) // ERROR--can't catch type variable }
  • 2.1.2)不過, 在異常規范中適用類型變量是允許的,以下方法是合法的:
public static <T extends Throwable> void dowork(T t) throws T // OK

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)以下代碼會把所有異常都轉換為 編譯器所認為的未檢查異常:
try { do work; } catch(Throwable t) { Block.<RuntimeException>throwAs(t); }
  • 2.2.3)吧以上代碼添加到一個抽象類中。 用戶可以覆蓋body 方法來提供一個具體的動作。 調用toThread 時, 會得到Thread類的一個對象, 它的run 方法不會介意已檢查異常;
public abstract class Block {public abstract void body() throws Exception;public Thread toThread(){return new Thread(){public void run(){try{body();}catch(Throwable t){Block.<RuntimeException>throwAs(t); }}}} } @SuppressWarnings("unchecked") // 消除對已檢查異常的檢查 public static <T extends Throwable> void throwAs(Throwable e) throws T { throw (T)e ;}

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泛型程序设计——泛型类的静态上下文中类型变量无效+不能抛出或捕获泛型类的实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。