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泛型FAQ知识点概述 #### 一、Java泛型基础知识 **1.1 泛型的概念** Java泛型是一种在编译时检查类型安全性的机制。它允许开发者定义类、接口或方法时使用参数化类型,从而可以重用代码,并在运行时保持...
Java泛型(Generics)是Java SE 5.0引入的一种新特性,它允许程序员在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。下面将根据给定的文件信息,深入解析Java泛型的一些核心知识点...
### A.Langer(2006)Java类属机制FAQ #### Java Generics:常见问题解答 ##### 关于本FAQ 这份文档是由Angelika Langer撰写并维护的关于Java类属机制...这份FAQ不仅是一份详细的指南,也是学习Java泛型的重要资源。
这份名为"JAVA-FAQ.rar_The Java FAQ_java编程"的压缩包提供了一个Java编程的常见问题解答集锦,帮助开发者解决他们在编程过程中可能遇到的疑惑。"JAVA FAQ.pdf"是其中的主要文档,包含了丰富的知识内容。 首先,这...
本压缩包“java_faq.rar”包含了关于Java编程的常见问题集锦,旨在帮助开发者解决在学习和实践中遇到的问题。 “Java常见问题集锦.pdf”很可能是文档形式的问题解答大全,它可能涵盖了以下几个方面: 1. **基础...
"java_FAQ.rar_Something About You" 提供的"java FAQ.pdf"很可能包含了一系列关于Java编程的常见问题与解答,帮助开发者解决他们在学习和实践中遇到的问题。下面我们将深入探讨一些Java的核心知识点。 1. **Java...
代码范例列表 第1章 示例描述:本章演示如何开始使用JDK进行程序的开发。...示例描述:本章学习泛型。 demoBounds.java 演示有界类型 demoForceChange.java 演示强制类型转换 demoGeneric.java ...
第三版反映了Java SE 5的更新和改进,包括泛型、枚举类型、可变参数方法等新特性。 #### 2. **《Java™ 编程语言》** - **作者**:Ken Arnold, James Gosling 和 David Holmes。 - **ISBN号**:0-201-70433-1。 ...
规范的第三版涵盖了Java 5.0版本的语言特性和改进,包括泛型、增强的for循环、可变参数以及枚举类型等。 在描述中提到的“第三版”指的是这份规范文档的第三个版本,它是在Java语言发展过程中的一个里程碑。James ...
文档提供了订阅“JavaFAQ Daily Tips”周刊的方式,包括通过电子邮件发送订阅请求至 `javafaqtips-request@javafaq.nu` 或者在网站上完成订阅流程。 ### 2. Java学习主题概述 文档列出了以下多个Java学习主题: #...
- [The Java Memory Model FAQ](http://www.cs.umd.edu/~pugh/java/memoryModel/) - [JMM Cookbook](http://gee.cs.oswego.edu/dl/jmm/cookbook.html) --- ##### 1.2 Java基础知识 **1.2.1 阅读源代码** - **...
泛型约束(Generic constraint) 嵌套类(Nested Class) 枚举类 对象表达式(Object Expression)与对象声明(Object Declaration) 委托(Delegation) 委托属性(Delegated Property) 函数与 Lambda 表达式 函数 高阶函数与 ...
- **常见问题 FAQ**:Kotlin 官方文档提供了一份 FAQ,解答开发者常见的疑问。 #### 与 Java 和 Scala 的比较 - **与 Java 比较**:Kotlin 相比 Java 提供了更多的语法糖和类型安全特性,同时保持了与 Java 的兼容...
类和继承 属性和字段 接口 可见性修饰词 扩展 数据对象 泛型 嵌套类 枚举类 对象表达式和声明 代理模式 代理属性 函数和lambda表达式 函数 高阶函数和lambda表达式 内联函数 其它 多重申明 Ranges 类型检查和自动...
**FAQ** 部分提供了常见问题解答,帮助解决在学习和使用 Kotlin 过程中可能遇到的问题。 通过阅读这份文档,开发者不仅能学会 Kotlin 的基础知识,还能了解到其与 Java 和 Scala 等其他语言的比较,从而更好地理解 ...
泛型 56 嵌套类与内部类 61 枚举类 62 对象表达式和对象声明 64 委托 67 委托属性 68 函数与 Lambda 表达式 73 函数 73 高阶函数和 lambda 表达式 78 内联函数 82 协程 85 其他 89 解构声明 89 集合:List、Set、Map ...
它支持多种编程范式,包括过程化编程、面向对象编程和泛型编程。C++广泛应用于系统编程、游戏开发等领域。 ##### 为何要选择纯C 学习纯C有助于你理解编程的基本概念,如指针、内存管理等。这对于想要深入了解底层...
Kotlin的文档资源包括Maven、Ant、Griffon和Gradle等工具的使用指南,以及如何与Java和Scala进行比较分析的FAQ。Kotlin代码文档的更新也正在积极进行中。 Kotlin的持续发展和官方支持,已经使得它成为一种非常有...
泛型编程是支持可重用代码开发的特性,Kotlin通过泛型类、函数和属性,提供了类型安全的泛型操作。 Kotlin还支持高阶编程概念,比如协程、代理模式、内联函数和扩展等。协程是Kotlin 1.1中的新特性,为异步编程提供...