泛型异常使用及代码解析

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

        }

 

     

      }

}

 


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