【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 泛型类的静态上下文中类型变量无效+不能抛出或捕获泛型类的实例 的知识;


【1】泛型类的静态上下文中类型变量无效

1.1)不能在静态域或方法中引用类型变量:

public class Singleton<T>
{private static T single; // ERRORprivate static getSingle() // ERROR{}
}

1.2)因为类型擦除后, 只剩下 Singleton 类, 它只包含一个 singleInstance 域;


【2】不能抛出或捕获泛型类的实例

2.1)既不能抛出也不能捕获泛型类对象。 且泛型类扩展 Throwable 也是不合法的;

如, public class Problem<T> extends Exception {} // ERROR--can't extend Throwable
  • 2.1.1)catch 子句中不能使用类型变量, 以下方法不能通过编译:
public static <T extends Throwable> void dowork(Class<T> t)
{...catch(T e) // ERROR--can't catch type variable
}
  • 2.1.2)不过, 在异常规范中适用类型变量是允许的,以下方法是合法的:
public static <T extends Throwable> void dowork(T t)  throws T // OK

2.2)Java 异常处理的一个基本原则是: 必须为所有已检查异常提供一个处理器。 不过可以利用泛型消除这个限制。 关键的方法如下:

@SuppressWarnings("unchecked")
public static <T extends Throwable> void throwAS(Throwable e) throws T
{throw (T)e;
}
  • 2.2.1)假设以上方法包含在 类 Block中, 如果调用 Block.《RuntimeException》throwAs(t); 编译器就会认为t 是一个未检查异常。
  • 2.2.2)以下代码会把所有异常都转换为 编译器所认为的未检查异常:
try
{     do work;    }
catch(Throwable t)
{ Block.<RuntimeException>throwAs(t); }
  • 2.2.3)吧以上代码添加到一个抽象类中。 用户可以覆盖body 方法来提供一个具体的动作。 调用toThread 时, 会得到Thread类的一个对象, 它的run 方法不会介意已检查异常;
public abstract class Block
{public abstract void body() throws Exception;public Thread toThread(){return new Thread(){public void run(){try{body();}catch(Throwable t){Block.<RuntimeException>throwAs(t); }}}}
}
@SuppressWarnings("unchecked")  // 消除对已检查异常的检查
public static <T extends Throwable> void throwAs(Throwable e) throws T
{ throw (T)e ;}

2.3)看个荔枝: 以下程序运行了一个线程, 它会抛出一个 已检查 的异常;

public class Test
{public static void  main(String[] args){new Block(){public void body() throws Exception{Scanner in = new Scanner(new File("ququqx"));while(in.hasNext())System.Out.println(in.next());}}.toThread().start();}
}
  • 2.3.1)运行这个程序, 会得到一个 栈轨迹;
  • 2.3.2)这有什么意义呢 ? 正常情况下, 你必须捕获线程run方法中的所有已检查异常, 把它们包装到 未检查异常中, 因为run方法声明为 不抛出 任何已检查异常;
  • 2.3.3)不过在这里, 我们并没有做这种包装。 我们只是抛出异常, 并哄骗编译器,让它认为这不是已检查异常;

Conclusion)通过使用泛型类, 擦除和 @SuppressWarnings 标注, 就能消除 java 类型系统的部分基本限制;

java泛型程序设计——泛型类的静态上下文中类型变量无效+不能抛出或捕获泛型类的实例相关推荐

  1. java泛型程序设计——Varargs 警告+不能实例化类型变量

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 Varargs 警告+不能实例化类型变量 的知识: [1] Vara ...

  2. java泛型程序设计——定义简单泛型类+泛型方法

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 定义泛型类+泛型方法的知识: [1]一个泛型类: 就是具有一个或多个 ...

  3. java泛型程序设计——反射和泛型

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 反射和泛型 的相关知识: [1]反射和泛型相关 1.1)现在, Cl ...

  4. java泛型程序设计——泛型类型的继承原则

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 泛型类型的继承原则 的知识: [1]泛型类型的继承原则相关 1.1) ...

  5. java泛型程序设计——类型变量限定 + 泛型代码和虚拟机

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 类型变量限定 + 泛型代码和虚拟机 的知识: [1]类型变量的限定 ...

  6. java泛型程序设计——无限定通配符+通配符捕获

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 无限定通配符+通配符捕获 的相关知识: [1]无限定通配符相关 1. ...

  7. java泛型程序设计——通配符类型+通配符的超类型限定

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 通配符类型+通配符的超类型限定 的知识: [1]通配符类型相关 1. ...

  8. java泛型程序设计——注意擦除后的冲突

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 注意擦除后的冲突 的知识: 1.1)当泛型类型被 擦除时, 无法创建 ...

  9. java泛型程序设计——约束与局限性

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 约束与局限性 的知识: [1] 不能用基本类型实例化类型参数 1.1 ...

最新文章

  1. mysql aa复制_MySQL主从复制实现
  2. 67.Java垃圾收集机制\对象引用\垃圾对象的判定\垃圾收集算法\标记—清除算法\标记—整理算法\分代收集\垃圾收集器\性能调优
  3. oracle拼接字符串报错,Oracle 中wmsys.wm_concat拼接字符串,结果过长报错解决
  4. 亚马逊训练alexa的方法_Alexa对话是AI驱动的对话界面新方法
  5. java调用jndi出错,无法使用Java JNDI上下文查找来访问对象
  6. 基于友善之臂ARM-ContexA9-ADC驱动开发
  7. 高品质平板电脑模型为您的作品演示加分
  8. C#编程(八十)---------- 异常类
  9. 三维模型_浅谈倾斜摄影及三维模型的应用行业
  10. linux设备开发详解宋宝华,[Linux设备驱动开发详解(第2版)].宋宝华.pdf
  11. android soundpool 播放音效,Android使用SoundPool播放短音效
  12. python矩阵连乘_第3章 动态规划——矩阵连乘最优计算方式查找
  13. RTE 2020 实时互联网大会参会指南——明天我们线上见!
  14. WOFF2与icon字体化
  15. h5支付不能打开支付宝 ios_iOS 手机网站支付转Native支付(H5支付页面调起支付宝客户端(app))...
  16. java毫秒数_Java中的毫秒数
  17. 网课搜题API接口搭建教程
  18. gitlab:切换远程仓库
  19. Java线程同步容易犯错的坑
  20. apicloud菜鸟教程_干货教程 | APICloud新手学习心得分享

热门文章

  1. Cover the Tree(2020多校第二场C)
  2. [ZJOI2007] 棋盘制作(单调栈 / DP悬线法)
  3. Message Decoding密码翻译
  4. 10.31模拟:总结
  5. P7519-[省选联考 2021 A/B 卷]滚榜【状压dp】
  6. Loj#6053-简单的函数【Min25筛】
  7. P4336-[SHOI2016]黑暗前的幻想乡【矩阵树定理,容斥】
  8. bzoj2226-[Spoj5971]LCMSum【欧拉函数,GCD】
  9. ssl1016 OJ8467-数的划分 鸣人的影分身【各种dp之8 7】
  10. 牛客练习赛 63 F-牛牛的树行棋