由於擦除的原因,catch語言不能捕獲泛型類型的異常(編譯、運行期都需要知道切確類型);那麼我們該如何使用泛型的異常呢?直接分析源代碼如下:
1.先是定義了一個接口:此接口中含有處理List<T>的Process方法,且此方法能拋出E類型的異常;
interface Processor<T,E extends Exception>//這裏是T和(E extendsException)其中E是繼承於異常;
{
voidprocess(List<T> resultCollector) throws E;
}
2.定義了一個類class ProcessRunner<T,E extends Exception>這個類繼承了ArrayList<Processor<T,E>>(多少一句,這裏<T,E>其實也是代表<T,E extends Exception>,因爲前面已經寫了,所以這邊就不需要了,只要簡單的寫<T,E>)用於綜合處理存放的Processor<T,E>,每個Processor<T,E>都被process方法處理(for循環);裏面有一個processAll()方法。
class ProcessRunner<T,E extends Exception> extendsArrayList<Processor<T,E>>
{
List<T>processAll() throws E{
List<T> resultCollector=new ArrayList<T>();用於接受個process處理完以後的數據;
for(Processor<T,E> processor:this){
processor.process(resultCollector);
}
return resultCollector;
}
}
3.將泛型Class實體化:
定義了一個繼承Exception的Failure2;
class Failure2extends Exception
{
}
4.用Processor2類實現了Processor<Integer,Failure2>,內部主要實現了process方法,該方法主要用於處理List<integer>;這種方法可以自由發揮;
class Processor2 implements Processor<Integer,Failure2>
{
static int count=2;//此處的count是一個靜態的,有所有Processor2共享!
public void process(List<Integer>resultCollector) throws Failure2{
if(count--==0){
resultCollector.add(47);
}
else{
resultCollector.add(11);
}
if(count<0){
throw new Failure2();
}
}
}
5.最後通過new一個 ProcessRunner<String,Failure1>()變量名:runner,然後裏面存放幾個Processor1
public classThrowGenericException
{
public static voidmain(String[] args){
ProcessRunner<String,Failure1>runner=new ProcessRunner<String,Failure1>();
for(int i=0;i<3;i++){
runner.add(newProcessor2());
}
try{
System.out.println(runner.processAll());
}catch(Exception E){
System.out.println(E);
}
}
}