关于java泛型其实挺复杂的,之前看文档的时候做过一些泛型名词摘记,今天把这这个笔记放到博客上来,以后抽空完善这篇关于泛型的文章
一 类型参数(Type parameters)
二 泛型子类型(Subtyping)
有点违反OOP的直觉
List<String> listStr = new ArrayList<String>();
List<Object> listObj = listStr; 不允许
三 泛型通配符(Wildcards):
Collection<?> 和Collection<Object>区别
type parameter is ?, it stands for some unknown type. ?表示未知类型
四 边界通配符(Bounded Wildcards):
List<Shape> shapes 与List<? extends Shape> shapes2的区别
List<? extends Shape> shapes2允许接收类型为Shape和Shape的子类型
Shape是通配符的上界
五 泛型方法(Generic Methods)
static void fromArrayToCollection(Object[] a, Collection<?> c) {
for (Object o : a) {
c.add(o); // compile-time error
}
}
编译错误,正确的写法是static后面void的前面加上泛型声明
static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
for (T o : a) {
c.add(o); // Correct
}
}
六 泛型方法和通配符使用区别
七 泛型参数命名约定:
E: element
T: Type
K: Key
V;Value
八 遗留代码
raw type :像Collection这样的泛型类型,不使用类型参数(type paramter)被称为raw type
遗留代码API操作集合未使用泛型,新代码调用的集合可以使用泛型参数。 遗留代码修改 支持泛型 修改过后的API二进制兼容老的客户端
九 未检查警告(unchecked warning):
十 上边界 下边界(lower bound)
下边界通配符 ? super T
上边界通配符 ? extend T
十一 上下边界泛型使用区别
In general, if you have an API that only uses a type parameter T as
an argument, its uses should take advantage of lower bounded wildcards (?
super T). Conversely, if the API only returns T,
you'll give your clients more flexibility by using upper bounded wildcards
(? extends T).
十二 通配符捕获(wildcard Capture)
十三 Multiple bounds 多边界
十四 协变(convariant) 逆变(contravariant) 可变(variance) 不变(invariant)
2 协变(convariant):String是Object的子类,如果List<String>是List<Object>的子类 则称为协变
3 逆变(contravariant):String是Object的子类,如果List<String>是List<Object>的父类 则称为逆变
4 可变(variance):如果带类型参数的类型支持协变或逆变,这称为可变
5 不变(invariant):即不支持协变也不支持逆变,则称为不变
十五 通配符类型(Wildcard types):如果类型参数未知,使用?表示,比如List<?> list = new ArrayList<>(); 由于List的泛型参数E具体类型未知,不能像list写入任何对象。
list.add("ONE") 提示The method add(capture#1-of ?) in the type List<capture#1-of ?> is not applicable for the arguments (String)
十六 类型擦除(Erasure):支持泛型的类或方法,泛型信息只在编译阶段起作用,运行时泛型的类型信息已经被擦除,
比如list 在运行时不能感知到底是List<String> 还是List<Object>
十七 PECS原则(producer-extends, comsumer-super)
指导如何使用上边界和下边界原则
十八 递归类型
比如Integer类的,Integer extends Number implements Comparable<Integer>
十九 类型推导(type inference)
从java7开始,编译器可以自动推到泛型类型参数比如
Map<String, List<String>> myMap = new HashMap<String, List<String>>();
可以将HashMap后面的泛型参数省略,只用<>
Map<String, List<String>> myMap = new HashMap<>();
相关推荐
Java泛型的用法及T.class的获取过程解析 Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析...
Java泛型是Java编程语言中的一个强大特性,它允许我们在定义类、接口和方法时指定类型参数,从而实现代码的重用和类型安全。在Java泛型应用实例中,我们可以看到泛型如何帮助我们提高代码的灵活性和效率,减少运行时...
Java 泛型详解 Java 泛型是 Java SE 5.0 中引入的一项特征,它允许程序员在编译时检查类型安全,从而减少了 runtime 错误...通过了解 Java 泛型的基本概念和关键字,我们可以更好地使用泛型来提高代码的质量和可读性。
下面将详细解释Java泛型的基本概念、使用方式以及相关的知识点。 1. 泛型的基本概念: - 泛型是一种参数化类型,允许在定义类、接口和方法时使用类型参数,从而创建一种可以适用于多种类型的通用代码。 - 泛型的...
下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...
本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 1. **发展历程** - **早期版本的局限**:在Java泛型出现之前,程序员通常使用Object作为容器类(如ArrayList、HashMap等)的默认类型...
下面我们将详细探讨Java泛型接口的相关知识点。 1. **泛型接口的定义** 泛型接口的定义方式与普通接口类似,只是在接口名之后添加了尖括号`<T>`,其中`T`是一个类型参数,代表某种未知的数据类型。例如: ```java...
综上所述,虽然Java泛型在编译后会进行类型擦除,但通过上述技巧,我们仍然能够在运行时获得关于泛型类实例化类型的一些信息。在实际开发中,这些方法可以帮助我们编写更加灵活和安全的代码。在示例文件`GenericRTTI...
* 泛型中有继承的概念吗? * ArrayList<Integer> al2=new ArrayList(); //1 al2.add(new Integer(10));//2 Integer i2=al2.get(0);//3 ArrayList<Object> alO=al2;// 这样可以吗? * 如果说 ArrayList<Integer> 是一...
Java泛型是Java编程语言中的一个强大特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。...在这个视频教程中,张孝祥老师将详细讲解这些概念,并通过实例帮助学员深入掌握Java泛型的使用。
通过阅读SUN公司的Java泛型编程文档,你可以深入学习这些概念,理解如何在实际项目中有效利用泛型提高代码质量,减少类型转换的麻烦,以及如何避免潜在的运行时错误。文档中的例子和解释将帮助你更好地掌握泛型的...
精选java关于泛型的原理,应用和面试题,包含所有泛型考点。例如,泛型的概念,类型,实例化,容易混淆的用法。每一道题附上答案,方便理解考试要点。
本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 1. **发展历程** Java泛型的引入是为了解决早期版本中类型转换频繁和潜在的ClassCastException问题。在Java泛型出现之前,集合框架...
这个"java泛型Demo"可能包含了一些具体的例子,如创建泛型类、泛型方法的使用,以及如何通过泛型处理集合。通过这些示例,你可以更直观地理解泛型的工作原理和实际应用。 总之,Java泛型是提高代码质量、安全性和...
Java泛型技术的发展历程及其在JDK1.4中的实现,是IT领域特别是软件开发与设计中的一个重要里程碑。本文将深入探讨泛型技术的概念、历史背景、与其它编程概念的区别,以及其在Java语言中的具体应用。 ### 泛型技术...