`
jboy
  • 浏览: 8572 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Java泛型FAQ

阅读更多
1. 什么是泛型?
泛型就是对类型进行抽象,如集合类型。

2. 为什么需要泛型?
避免类型的强制转换,以及其带来的潜在bug。取而代之让编译器保证类型安全。
更明确的表达设计意图,增强可读性。

3. 泛型长什么样?
List<E> E代表所有可能的类型如Integer,String等。注意其与C++的模板不同之处。
命名习惯:尽量使用简练的单个字母作为形参名字,如T,E,S。

4. 泛型有没有继承关系?List<String>是List<Object>的子类吗?
如果Foo是Bar的子类,G是某个泛型声明,G<Foo>是G<Bar>的子类并不成立。
List<String> ls = new ArrayList<>();
List<Object> lo = ls; // compile error
lo会影响ls,从ls里面取出来的就不一定是String了,类型安全无法保证。

所有泛型类型在运行时都拥有相同的class,不管他们的实际参数是什么类型。
如List<String>.getClass() == List<Object>.getClass() – true。

既然拥有相同的class,那么运行时的类型检查也就没有意义了。所以instanceof对于泛型没有用了。

5. 那什么是泛型的父类呢?
简单的理解,List<?>可以认为是所有List的父类,可以匹配任何类型。?是通配符。
我们可以从List<?>中读取元素,并且其一定是Object。但是我们无法写入任何元素—因为编译器不知道?是什么类型,唯一的列外是可以写入null—它是所有类型的成员。
Collection<?> c = new ArrayList<String>();
c.add(new Object()); // compile error

同时,将一个未知泛型赋值个另一个未知泛型是合法的。这个称为通配符匹配。如
Set<?> s = new HashSet<>();
Set<?> ss = s;

6. 有哪些通配符呢?
上限通配符--<? extends SomeClass> ?是SomeClass的一个子类(不必是extends SomeClass),也可以是SomeClass本身。但是不能向其写入。
List<? extends Map> lm = new ArrayList<>();
lm.add(new HashMap()); // compile error
因为编译器不知道?是HashMap还是HashMap的父类,或者是其他的Map—这种情况下类型安全不能保证。

下限通配符--<? Super SomeClass>表示?是SomeClass的一个未知父类。

具体的使用场景是什么呢?
如果你只是用类型参数作为参数使用,应该使用? Super T。
如果你的方法只返回T,那么应该使用? Extends T。

7. 如果一个泛型类型,不使用类型参数会怎样?
这种情况称为Raw Type,如Class,可以简单理解为Class<?>。
注意将一个raw type赋值给一个限定类型的泛型,是合法的,但是会有一个unchecked warning,因为编译器无法保证类型安全,但是兼容老代码时是很有必要的。

8. 什么是泛型方法?
方法声明中带有一个或多个类型参数如static <T> toArray(Collection<T> c)。

9. 什么时候使用类型参数,什么时候使用泛型方法呢?
类型参数多用于多态,唯一效果是允许调用时使用不同的类型,支持灵活的子类化。
而泛型方法是来表示方法的参数之间或者参数与返回值之间的依赖关系的。
如public static <T> void copy(List<? super T> dest, List<? extends T> src)
注意在所有可能的情况下使用通配符,通配符还有另一个优势,可以在方法签名之外使用如field的类型,局部变量等。

10. 什么是类型擦除?
所谓擦除,就是指丢弃所有泛型类型的信息,在所有对类型变量的引用时都替换成其上限—通常都是Object,并且无论何时如果需要的类型不正确时,都会插入一个合适的类型转换。
在多重界限的时候,第一个类型会被用作擦除的类型。如
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
分享到:
评论

相关推荐

    Java泛型编程指南.pdf

    Java泛型编程指南.pdf 此文章译自SUN的泛型编程指南

    Java泛型和集合

    Java Generics and Collections 英文版,详细描述java 泛型技术

    JAVA泛型加减乘除

    这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...

    java 泛型接口示例

    java 泛型接口示例 java 泛型接口示例 java 泛型接口示例

    java 泛型类的类型识别示例

    java 泛型类的类型识别示例 java 泛型类的类型识别示例 java 泛型类的类型识别示例

    1.java泛型定义.zip

    1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1....

    java 泛型方法使用示例

    java 泛型方法使用示例 java 泛型方法使用示例 java 泛型方法使用示例

    4.java泛型的限制.zip

    4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip...

    java泛型技术之发展

    java泛型技术之发展,学习JAVA 泛型的不错东东

    Java泛型的用法及T.class的获取过程解析

    主要介绍了Java泛型的用法及T.class的获取过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java泛型总结

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

    java泛型学习ppt

    java,学习java泛型,java培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptx

    很好的Java泛型的总结

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

    java泛型详解.pdf

    java泛型详解.pdf

    思维导图之Java泛型详解

    思维导图之Java泛型详解

    Java泛型使用详细分析.pdf

    Java泛型使用详细分析.pdf

    实例讲解Java泛型编程的快速入门

    实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门

    JAVA泛型简单排序实例

    JAVA泛型源代码实现以下功能:返回数组元素的最大值/最小值下标;判断数组元素是否按升序排列;T对象数组排序;二分法查找key元素;

    Java泛型技术之发展

    Java泛型技术之发展

Global site tag (gtag.js) - Google Analytics