------- android培训、java培训、期待与您交流! ----------
1. 什么是泛型?
泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。可以在集合框架(Collection framework)中看到泛型的动机。泛型最大的优点就是消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中,同时提高Java 程序的类型安全,增强程序的可靠性!
2.泛型基础
2.1类型参数
定义泛型类或声明泛型类的变量时,使用尖括号来指定形式类型参数。
public class GenericsDemo14{ public static void main(String args[]){ Info<String> i = new Info<String>() ; // 使用String为泛型类型 i.setVar("it") ; // 设置内容 fun(i) ; }
2.2命名类型参数
推荐的命名约定是使用大写的单个字母名称作为类型参数
推荐的名称是:
K —— 键,比如映射的键。
V —— 值,比如 List 和 Set 的内容,或者 Map 中的值。
E —— 异常类。
T —— 泛型。
class Notepad<K,V>{ // 此处指定了两个泛型类型 private K key ; // 此变量的类型由外部决定 private V value ; // 此变量的类型由外部决定 public K getKey(){ return this.key ; } public V getValue(){ return this.value ; } public void setKey(K key){ this.key = key ; } public void setValue(V value){ this.value = value ; } }
2.3类型通配符
引入了类型通配符,可以声明 List<?> 类型的变量。
假设您具有该方法:
void printList(List l) { for (Object o : l) System.out.println(o); }
上面的代码在 JDK 5.0 上编译通过,但是如果试图用 List<Integer> 调用它,则会得到警告。出现警告是因为,您将泛型(List<Integer>)传递给一个只承诺将它当作 List(所谓的原始类型)的方法,这将破坏使用泛型的类型安全。
如果试图编写像下面这样的方法,那么将会怎么样?
void printList(List<Object> l) { for (Object o : l) System.out.println(o); }
它仍然不会通过编译,因为一个 List<Integer> 不是 一个 List<Object>。这才真正烦人 —— 现在您的泛型版本还没有普通的非泛型版本有用!
解决方案是使用类型通配符:
void printList(List<?> l) { for (Object o : l) System.out.println(o); }
上面代码中的问号是一个类型通配符。它读作“问号”。List<?> 是任何泛型 List 的父类型,所以您完全可以将 List<Object>、List<Integer> 或 List<List<List<Flutzpah>>> 传递给 printList()。
2.4 泛型方法
在类的定义中添加一个形式类型参数列表,可以将类泛型化。方法也可以被泛型化,不管它们定义在其中的类是不是泛型化的。
class Demo{ public <T> T fun(T t){ // 可以接收任意类型的数据 return t ; // 直接把参数返回 } } ------------------------------------------------------------------------------------- /*泛型方法不一定要通过参数来确定泛型准确类型,可以只通过返回值*/ public static ArrayList<E> newArrayList() { return new ArrayList<E>(); } public List<PrepaidHistory> queryHistories(Long skyid,PrepaidHistoryType type, Date from, Date end) { 。。。 return Lists.newArrayList();//智能的知道返回类型为repaidHistory }
2.5有限制类型
可以对类型进行限定:
? extends E:接收E类型或者E的子类型对象。上限!
? super E :接收E类型或者E的父类型。下限!
class Info<T extends Number>{ // 指定上限,只能是数字类型 private T var ; // 此类型由外部决定 public T getVar(){ return this.var ; } public void setVar(T var){ this.var = var ; } public String toString(){ // 覆写Object类中的toString()方法 return this.var.toString() ; } } public class GenericsDemo27{ public static <T extends Number> Info<T> fun(T param){//方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定 Info<T> temp = new Info<T>() ; // 根据传入的数据类型实例化Info temp.setVar(param) ; // 将传递的内容设置到Info对象的var属性之中 return temp ; // 返回实例化对象 } }
public static void printCollection(Collection<? super Student> al){ Iterator<? super Student> it = al.iterator(); //接受student类型或它的父类型。 while(it.hasNext()){ System.out.println(it.next()); } }
2.6泛型数组
public class GenericsDemo30{ public static void main(String args[]){ Integer i[] = fun1(1,2,3,4,5,6) ; // 返回泛型数组 fun2(i) ; } public static <T> T[] fun1(T...arg){ // 接收可变参数 return arg ; // 返回泛型数组 } public static <T> void fun2(T param[]){ // 输出 System.out.print("接收泛型数组:") ; for(T t:param){ System.out.print(t + "、") ; } } }
相关推荐
在"黑马程序员_Java基础辅导班教程课件[第01期]第13天"中,我们聚焦于Java编程语言的基础知识,这是一门面向初学者的课程,旨在帮助学员快速掌握Java开发的基本技能。第13天的课程通常会涵盖上一天(第12天)所学...
泛型允许程序员在类、接口和方法中使用类型参数,使得容器(如ArrayList、LinkedList等)可以保存特定类型的元素,避免了强制类型转换的麻烦,并且在编译阶段就能发现可能的类型错误。 1. **泛型的基本概念**: - ...
《Cpp设计新思维_泛型编程与设计模式之应用》这本书深入探讨了C++编程中的泛型编程和设计模式的应用,对于提升C++开发者的技术水平具有极高的价值。以下是本书涉及的一些关键知识点: 1. 泛型编程:泛型编程是C++中...
### C# 泛型的应用详解 #### 一、泛型的概念 在C#中,泛型是一种能够编写灵活且类型安全代码的强大工具。通过使用泛型,开发人员可以在不牺牲性能的情况下实现代码重用。简单来说,泛型允许开发者创建可以处理多种...
T21.13_泛型DAO模式与OSIV java 经典教程 经典教材
在C#编程语言中,泛型是一种强大的特性,它允许我们编写可重用的代码,同时保持类型安全和性能。"fanxing.rar_泛型"这个压缩包文件可能包含了一系列关于C#泛型的练习,旨在帮助学习者深入理解和熟练运用泛型。现在,...
【C# 泛型集合详解】 C# 泛型集合是面向对象编程(OOP)中的一个重要特性,尤其是在C#语言中,它极大地提升了代码的效率和安全性。在C# 2.0版本引入泛型之后,开发人员可以更加方便地创建和管理强类型的数据集合,...
1. **泛型**:泛型是Java 5引入的最重要的特性之一,它允许在类、接口和方法中使用类型参数,从而实现了类型安全的集合操作。泛型的主要优点是避免了类型转换的麻烦,消除了运行时的类型异常。例如,ArrayList可以...
本资料包"SpringIOC_泛型依赖注入.zip"主要关注的是Spring如何通过泛型进行依赖注入,这是一种更加灵活且类型安全的注入方式。 在Java编程中,泛型是一种强大的特性,允许我们在类、接口和方法中使用类型参数,从而...
泛型是Java编程语言中的一个强大特性,它允许在定义类、接口和方法时使用类型参数,从而提高代码的重用性、安全性和效率。在本文中,我们将深入探讨泛型的声明、使用、特点、约束、方法以及泛型类和泛型缓存。 首先...
《GP-泛型算法通则》是一份深入探讨GP(Genetic Programming)算法与泛型编程相结合的资源包。GP算法是一种基于生物进化原理的计算方法,它模仿自然选择和遗传过程来解决复杂问题,而泛型编程是编程语言中的一种技术...
在IT行业中,泛型是Java、C#等编程语言中的一种强大的特性,它允许程序员在定义数据结构或方法时引入类型参数,以提高代码的复用性和安全性。本篇文章将深入探讨“泛型的使用进阶”,包括泛型缓存、泛型类、泛型方法...
- **定义**:泛型是Java SE 5.0引入的新特性,它允许程序员在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。 - **作用**: - 消除强制类型转换。 - 在编译期进行类型检查,减少...
Java 泛型是Java语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。泛型允许我们在编程时指定容器(如集合)所存储的数据类型,从而在编译阶段就能捕获类型错误,而...
Java是世界上最流行的编程语言之一,尤其在...总结来说,"黑马程序员Javase笔记"涵盖了Java的基础语法、内存管理、面向对象编程、集合框架以及泛型和Map等内容,这些都是成为一名合格Java开发者必须掌握的核心知识。
《黑马程序员匠心之作 C++教程_第7阶段-C++实战项目机房预约讲义》是为C++初学者量身定制的一份详细教学资源。这份讲义深入浅出地介绍了C++编程语言,并通过实际的机房预约系统项目,帮助学习者将理论知识与实践相...
简单介绍 里氏替换原则 简单工程模式 实现任意排序 使用了 is 和 as 方法 ArrayList数组 与 List泛型集合 Hashtable数组 与 Dictionary,v>泛型集合 的基本使用 序列化 将数据存储