2014-05-23 29 views
3

Cannot Create, Catch, or Throw Objects of Parameterized Types (Java Tutorials)在拋出子句中使用泛型是否有效?

你可以,但是,在throws子句中使用類型參數:

class Parser<T extends Exception> { 
    public void parse(File file) throws T {  // OK 
     // ... 
    } 
} 

但爲什麼要?你不能在這裏構建T。如果在外部構建它後注入T,是不是它的堆棧跟蹤會全部錯誤?他們是不是簡單地記錄了一個偶然發生的功能,而不管它是否有用?

回答

2

你可以有

public class ExceptionWithPayload<T> extends Exception { 
    private final T payload; 
    public ExceptionWithPayload(T payload) { 
     this.payload = payload; 
    } 
    public T getPayload(){ 
     return payload; 
    } 
} 

,然後在其它的類,你可以寫

throw new ExceptionWithPayload<MyClass>(myObject); 

,以便能夠通過任何對象,你回到捕捉異常的東西,但在catch子句中檢查類型。

3

爲什麼不

class FooParser extends Parser<FooException> { 
    public void parse(File file) throws FooException { 
     throw new FooException("Not Supported"); 
    } 
} 
相關問題