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