java泛型小结2

java泛型总结2
1 Java 泛型设计中的一些主要限制和使用方面错误。



1.1 不能将泛型用在创建类型对象中,原因则是因为Java泛型中存在类型擦除的原因,所以会导致在Java虚拟机执行时,所有泛型类型都会相应的变为它的原始类型,这就意味着如果创建泛型对象则Java虚拟机会将创建的对象改变为Object这肯定不会是希望所应该有的目的。



1.2 不能将泛型应用在基本数据类型中,原因也是因为类型擦除机制的缘故,而基本类型不属于对象,如果要将基本类型应用到泛型当中则必须使用相应的包装器来做为替代方式。



1.3 不能将泛型用在异常捕获和用泛型来实现Throwable子类,如果这样做的会导致无法通过编译。



1.4 泛型数组是不合法的,原因同样出于类型擦除会导致创建的数组变为Object,而如果需要达到这样的目的,则必须使用类型信息中的Class类来满足要求。如果先创建一个类型数组而后转型为Object或是先声明类型数组而后创建一个Object数组通过强制类型转换来实现类型数组都将导致失败或者是类型擦除方面的问题。



1.5 无法将泛型用于静态的上下文中,原因同样还是出于类型擦除,如果允许这样实现则有可能使用泛型创建一个共享Swing构建或者AWT构建等一些会出现严重错误的缺陷。



1.6 使用泛型时应注意覆盖equals等方法的问题,原因是会导致编写出的代码导致一些难于发现的错误,但是表面上却很难让进行错误的查找。



1.7 在使用泛型时不能同时为两个接口的子类型,而这2个接口是同一个接口的不同参数,

这条限制可以理解为,如果Employee类实现了Comparable<Employee>而Manager类继承了Employee类并且实现Comparable<Manager>接口,这样一来虽然子类和父类实现接口的约束条件是不同的,但是却是是想了同样的接口而该接口的类型参数又是父子的继承关系。则会与Java虚拟机合成的桥方法可能产生一些冲突。



Java泛型的约束和限制的总结。经过阅读了2遍书籍和了解,感觉Java的泛型设计和C#,C++,Python(该语言经过一些了解虽然语言本身不显示包括泛型的概念,但是由于其是纯面向对象和一些语言特性,则它隐身的方法中都包含拥有泛型特点)等语言的泛型设计的不同是Java由于其历史原因包含了类型擦除的特点,所以导致了很多在其它同类语言中不存在的限制和要求,导致有些时候会出现很多难以发现和错误提示含糊不清或者难以理解的情况。

Java通配符主要用来解决泛型设计中类型约束中继承概念所导致的限制,原因则是Java泛型中,可以为各种容器和集合来添加类型约束用来获取类型检查功能避免导致错误的类型再程序运行时才会被发现出来。但是却有产生了一些另人烦恼的限制,比如为了保证类型的安全一个Pair<Employee>对象是一个Pair<Manager>将不会有任何关联,也就是说不能将Pair<Employee>和Pair<Manager>指向同一个引用,(当然如果说声明了Pair<Employee>对象需要把1个Manager对象存储到其中这样子是可以允许的不会出现错误,因为毕竟1个Manager也是1个Employee)。所以在这种情况下就需要使用通配符来放宽这样的限制

通配符可以用来实现以下2个语法 <? Super Manager>和<? Extends Employee> 前者的含义为保存在容器中的对象可以为Manager的任何父类,或者是任何Manager实现的接口。

而后者则相反为必须继承了Employee的子类或者是实现了Employee的子类型。而这2个语法各支持1种操作,<? Super Manager>支持对数据域的修改,而<? Extends Employee> 则支持对数据域的访问,上面这2个功能个人感觉可以用面向对象程序设计中的继承和多态来解释和理解。个人理解的含义就是如果使用<? Super Manager>父类中的数据域同时也会在子类中拥有,所执行提供参数的功能时不会出现任何问题,也就是说不会出现访问一个在父类中不存在的数据域的情况,而如果使用<? Extends Employee>子类中包含了父类的所有数据域所有可以实现访问的功能。



总之对这2个语法的理解可以为,父类限定通配符可以向泛型对象进行写入,而子类限定通配符则可以向泛型对象读取。



最后通配符的一个应用的语法可以为Employee<?>,该语法虽然形式上可能和不带泛型的对象相同,但是任何时Employee<?>都要比不带泛型的对象要更好,同时在一些简单的情况下使用这样的语法可以实现一些比使用普通语法更简便和可读性更强的版本