`
hongjn
  • 浏览: 55270 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

Java泛型总结(四)

阅读更多

Java泛型程序设计中的一些限制和局限:
1)不能用基本类型实例化类型参数
     例如Pair<double>是不可能出现的,原因是类型擦除(见总结第3篇)之后,Pair会含有Object的域,但是Object不能存储double或者int等基本类型的值。

2)运行时类型查询只适用于原始类型
     比如instanceof或者强制转换就涉及到,运行时类型检查,那意思就是说,
     o instanceof Pair<String> 实际就是相当于 o instanceof Pair,String或者T之类的都被忽略。
     Pari<String> pair = (Pair<String>) o; o只要是Pair类型就可以了,String同样被忽略。
     因此,
     Pair<String> sPair = ...;
     Pair<Date> dPair = ...;
     sPair.getClass() == dPair.getClass() 为true,它们都返回的是Pair.class。

3)不能抛出也不能捕获泛型类实例
     泛型类不能扩展异常类Throwable!
     public class MyException<T> extends Exception { /*  */ }  // error
     不能在catch子句中使用类型变量,如下是不允许的:
     public <T extends Throwable> void doWork(Class<T> t) {
          try{
               do something
          }catch(T t){ // ERROR
          
          }
     }

However, it is ok to use type variables in exception specifications. The following 
method is legal:
public static <T extends Throwable> void doWork(T t) throws T // OK

   try
   {
       do work
   }
   catch (Throwable realCause)
   {
      t.initCause(realCause);
      throw t; 
   }
}

4)参数化类型的数组不合法
     简单的说,就是 Pair<String>[] pairs = new Pair<String>[100] 是ERROR的,
     这种情况最好的方法是使用ArrayList<Pair<String>>既安全又有效。

5)不能实例化类型变量,就是不能使用new T(...), new T[...],或者T.class这样的表达式
     例如,下面这样的代码,
     public static <T extends Comparable> T[] test(T[] a){
          Object[] m = new Object[2];
          ...;
          return (T[]) m;
     }
     在执行String[] ss = test("aa", "bb");时就就出现异常,因为它试图讲Object[]赋给String[].
     但是,我们可以通过反射来解决这个问题,就是调用Array.newInstance:
     public static <T extends Comparable> T[] test(T[] a){
          T[] m = (T[]) Array.newInstance(a.getClass().getComponentType(), 2);
           ...;
     }

6)泛型类的静态上下文中类型变量无效(Type Variables Are Not Valid in Static Contexts of Generic Classes)
You cannot reference type variables in static fields or methods. For example, the follow-
ing clever idea won’t work:

  public class Singleton<T>
  {
     public static T getSingleInstance() // ERROR
     {
        if (singleInstance == null) construct new instance of T
        return singleInstance;
     }
     private static T singleInstance; // ERROR
  }

If this could be done, then a program could declare a Singleton<Random> to share a random
number generator and a  Singleton<JFileChooser> to share a file chooser dialog. But it can’t
work. After type erasure there is only one Singleton class, and only one singleInstance field.
For that reason, static fields and methods with type variables are simply outlawed. 

7)最后,要注意擦除后的冲突
例如:
class Calendar implements Comparable<Calendar> { . . . }
class GregorianCalendar extends Calendar implements Comparable<GregorianCalendar>
   { . . . } // ERROR   


1
1
分享到:
评论

相关推荐

    很好的Java泛型的总结

    很好的Java泛型的总结,看完之后你一定会知道java泛型的底层机制,你一定会学会Java泛型!

    java泛型总结

    深入理解java泛型,包括类名泛型的定义,方法泛型定义,泛型的返回

    全面总结Java泛型

    • 全面总结Ja• 全面总结Java泛型v• 全面总结Ja• 全面总结Java泛型va泛型a泛型• 全面• 全面总结Java泛型• 全面总结Java泛型总结Java泛• • 全面总结Java泛型全面总结Java泛型型• • 全面总结Java泛型全面...

    思维导图之Java泛型详解

    思维导图之Java泛型详解

    Java泛型总结(2)进阶篇

    NULL 博文链接:https://fantaxy025025.iteye.com/blog/2213815

    JAVA泛型总结

    java 泛型详解 实例 class Point class Notepad,V&gt;{ // 此处指定了两个泛型类型 } 通配符、受限泛型、泛型无法向上转型、泛型接口、泛型方法、通过泛型方法返回泛型类型实例、使用泛型统一传入的参数类型、泛型数组...

    java泛型总结.docx

    类型推断:在Java 7及以上版本中,可以使用varargs和钻石操作符来推断类型参数。例如,List[] lists = Arrays.asList(new List() {{ add("hello"); add("world"); }}); 泛型边界:可以使用泛型边界来限制类型参数的...

    全面总结Java泛型--实例

    全面总结Java泛型--实例

    Java泛型编程最全总结

    NULL 博文链接:https://qiemengdao.iteye.com/blog/1525624

    java-泛型总结【从入门到项目总结】

    关于java泛型的总结: 从入门介绍到项目使用的实际经验归纳总结得出! 从jdk5到jdk8!

    java泛型.xmind

    自己总结的java泛型的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者

    Java 泛型总结(一):基本用法与类型擦除

    本文主要介绍了Java泛型的使用以及类型擦除相关的问题。具有很好的参考价值。下面跟着小编一起来看下吧

    Java 泛型总结及详解

    主要介绍了Java 泛型的相关资料,并附简单实例代码,需要的朋友可以参考下

    Java中泛型总结(推荐)

    主要介绍了Java中泛型总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java 泛型总结(二):泛型与数组

    数组与泛型的关系还是有点复杂的,Java 中不允许直接创建泛型数组。本文分析了其中原因并且总结了一些创建泛型数组的方式。具有很好的参考价值。下面跟着小编一起来看下吧

    java深度历险

    JAVA泛型 28 类型擦除 28 实例分析 29 通配符与上下界 30 类型系统 31 开发自己的泛型类 32 最佳实践 32 参考资料 33 目录 3 JAVA注解 34 使用注解 34 开发注解 35 处理注解 35 实例分析 38 参考资料 39 JAVA反射与...

    基于java中泛型的总结分析

    本篇文章介绍了,在java中泛型的总结分析。需要的朋友参考下

    泛型技术归纳

    Java泛型简明教程 泛型是Java SE 5.0中引入的一项特征,自从这项语言特征出现多年来,我相信,几乎所有的Java程序员...这就是为什么我想使用一种最简单的形式来总结一下程序员需要知道的关于Java泛型的最基本的知识。

    Java 泛型总结(三):通配符的使用

    在泛型的使用中,还有个重要的东西叫通配符,本文介绍通配符的使用。具有很好的参考价值。下面跟着小编一起来看下吧

    Java总结篇系列:Java泛型详解

    下面小编就为大家带来一篇Java总结篇系列:Java泛型详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Global site tag (gtag.js) - Google Analytics