由于存在类型擦除,泛型中异常的处理受到限制。由于异常的类型必须在编译或运行时,确切知晓,否则,异常无法被捕获。泛型类型通常不能直接的或者间接的继承Throwable,这进一步阻止了你处理不能被捕获的异常。
尽管如此,类型参数还是被用在方法声明的异常语句中的,他允许你通过检查类型信息来写泛型的代码
interface Processor<T,E extends Exception>{
void process(List<T> resultCollector) throw E;
}
class ProcessRunner<T,E extends Exception> extends ArrayList<Processor<T,E>>{
List<T> processAll() throw E{
List<T> resultCollector = new ArrayList<T>();
for(Processor<T,E> processor:this)
processor.process(resultCollector);
return resultCollector;
}
}
class Failure1 extends Exception{}
class Processor1 implements Processor<String,Failure1>{
static int count = 3;
public void process(List<String> resultCollector) throw Failure1{
if(count-->1){
resultCollector.add("Hep");
}else{
resultCollector.add("Ho");
}
if(count<0)
throw new Failure1();
}
}
class Failure2 extends Exception{}
class Processor2 implements Processor<Integer,Failure2>{
static int count = 2;
public void process(List<Integer> resultCollector) throw Failure2{
if(count-- == 0){
resultCollector.add(47);
}else{
resultCollector.add(11);
}
if(count<0)
throw new Failure2();
}
}
public class ThrowGenericException{
public static void main(String[] args){
ProcessRunner<String,Failure1> runner = new ProcessRunner<String,Failure1>();
for(int i=0;i<3;i++)
runner.add(new Precessor1());
try{
System.out.println(runner.processAll());
}catch(Failure1 e){
System.out.println(e);
}
ProcessRunner<Integer,Failure2> runner2 = new ProcessRunner<Integer,Failure2>();
for(int i=0;i<3;i++)
runner2.add(new Proccesor2());
try{
System.out.println(runner2.processAll());
}catch(Failure2 e){
System.out.println(e);
}
}
}
Processor类执行process()方法可能抛出exception E,process()的结果是存储数据到List<T> resultCollector(这也叫集合参数)。ProcessRunner有一个processAll方法可以执行每一个它所持有的对象,然后返回结果。如果你不能把抛出的异常参数化,由于异常检查机制你将不能够写泛型的异常处理代码。