由于擦除的原因,将泛型运用于异常是非常受限的。catch语句不能捕获泛型类型的异常,因为在编译期和运行期都必须知道异常的确切类型。但是,类型参数可能会在一个方法的throw子句中用到。这使得你可以编写随检查型异常的类型而发生变化的泛型代码。请看下面的例子。

 interface Processor<T,E extends Exception> {
void process(List<T> resultCollector) throws E;
} class ProcessRunner<T,E extends Exception> extends ArrayList<Processor<T,E>> {
List<T> processAll() throws 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) throws 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) throws 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<>();
for(int i = 0; i < 3; i++)
runner.add(new Processor1());
try {
System.out.println(runner.processAll()); // [Hep!, Hep!, Ho!]
} catch(Failure1 e) {
System.out.println(e);
}
ProcessRunner<Integer,Failure2> runner2 = new ProcessRunner<>();
for(int i = 0; i < 3; i++)
runner2.add(new Processor2());
try {
System.out.println(runner2.processAll());
} catch(Failure2 e) {
System.out.println(e); // chapter15.class14.Failure2
}
}
}

最新文章

  1. Si2155
  2. div中显示页面
  3. SQL时间相关
  4. 带有两个输入字段和相关标记的简单 HTML 表单:
  5. Web语义化
  6. kibana ,logstash and filebeat
  7. B/S与C/S区别
  8. 为什么margin-top不是作用于父元素
  9. python入门第一天作业。讲师写的代码。
  10. 【转】VC的MFC中重绘函数的使用总结(整理)
  11. JavaScript可以这样用
  12. PHP关于数组缓存JSON、serialize、var_export的说明
  13. Pots(BFS)
  14. Linux 添加ssh 公钥访问
  15. 12、手把手教你Extjs5(十二)执行菜单命令在tabPanel中显示模块
  16. ==和equals()的区别
  17. Initialize the shader 初始化着色器
  18. Membership 介绍
  19. centos7 docker使用https_proxy 代理配置
  20. springcloud灰度发布实现方案

热门文章

  1. 最简单之安装azkaban
  2. wmware虚拟化的启动问题
  3. vector简单使用
  4. 【bzoj3083】遥远的国度(树链剖分+线段树)
  5. 01 salt平台,软件架构图
  6. More development resources
  7. 牛客练习赛52 B题【树状数组维护区间和{查询区间和,如果区间元素重复出现则计数一次}】补题ing
  8. HZWER
  9. Linux网络命令——ifconfig、ifup、ifdown
  10. SpringCloud-Config通过Java访问URL对敏感词加密解密