Java 泛型类约束与局限性

Java 泛型类约束与局限性

 

1.不能用基本类型实例化类型参数;

  1. Pair<double>   // 这样是错误的  

 

2.运行时类型查询只适用于原始类型

  1. Pair<String> stringPair = ...;  
  2. Pair<Employee> employeePair = ...;  
  3. if(StringPair.getClass() == employeePair.getClass())// they are equal  


 

3.不能抛出也不能捕获泛型类实例

  1. public class Problem<T> extends Exception{/*  */// error -- can't extend Throwable  
  2. public static <T extends Throwable> void doWork(Class<T> t) {  
  3.     try {  
  4.          do work;  
  5.     } catch(T e) { // error -- can't catch type variable  
  6.         Logger.global.info(...);  
  7.     }  
  8. }  
  9.   
  10. public static <T extends Throwable> void doWork(T t) { // ok  
  11.     try {  
  12.         do work;  
  13.     } catch(Throwable realCause) {  
  14.         t.initCause(realCause);  
  15.         throw t;  
  16.     }  
  17. }  



4.参数化类型的数组不合法

  1. Pair<String>[] table = new Pair<String>[10]; // Error  


 

5.不能实例化类型变量

  1. public Pair() {  
  2.     first = new T(); // error  
  3.     second = new T(); // error  
  4. }  
  5.   
  6. public static <T> Pair<T> makePair(Class<T> cl) { // ok  
  7.     try {  
  8.         return new Pair<T>(cl.newInstance(), cl.newInstance());  
  9.     } catch(Exception e) {  
  10.         return null;  
  11.     }  
  12. }  
  13.   
  14. Pair<String> p = Pair.makePair(String.class);  


 

6.泛型类的静态上下文中类型变量无效

  1. public class Singleton<T> { // error  
  2.     private static T instance; // error  
  3.     public static T getSingleInstance() {  
  4.         if(null == instance) {  
  5.             instance = ...; // construct new instance of T  
  6.             return instance;  
  7.         }  
  8.     }  
  9. }  


 

7.注意擦除后的冲突

  1. public class Pair<T> {  
  2.     private T first;  
  3.     private T second;  
  4.     public boolean equals(T value) {  
  5.         return first.equals(value) && second.equals(value);  
  6.     }  
  7. }  
  8. boolean equals(String) // define in Pair<T>  
  9. boolean equals(Object) // inherited from Object  
  10. boolean equals(T) // T is erased into Object  
  11. boolean equals(Object) // two identical equals methods 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值