泛型異常使用及代碼解析

由於擦除的原因,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);

        }

 

     

      }

}

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章