java-泛型程序设计(一)
来源:互联网 发布:淘宝订单交易风险违规 编辑:程序博客网 时间:2024/06/14 15:28
java学习之路-泛型程序设计(一)
参考书籍-java核心技术卷unit8
泛型对于java程序员来说分为几个等级:
1仅仅使用泛型类,jdk设计员已经实现了拿来用就好(可以忽略此文)
2实现自己的泛型类与方法,了解集合中泛型的实现机制。
接下来我们要讨论几个关于泛型的关键点
- 怎么自定义一个泛型类
- 怎么定义一个泛型方法
- 对于类型变量的限定
- 虚拟机对于泛型的类型擦除机制
1 定义简单泛型类
一个泛型类就是具有一个或者多个类型变量的类。
具体什么叫 “类型变量“ 表面意思是一个变量可以表示任意类型。具体的见下面描述。
例如下面的例子
public class Pair<T> { private T first; private T second; public Pair() { first = null; second = null; } public Pair(T first, T second) { this.first = first; this.second = second; } public T getFirst() { return first; } public T getSecond() { return second; } public void setFirst(T newValue) { first = newValue; } public void setSecond(T newValue) { second = newValue; }}
T 是类型变量,泛型类还可以有多个类型变量T,U…等等T,U表示不同的类型。
public class Pair<T,U>{..}
在javase7版本之后,构造函数可以省略泛型类型,编译器可以自动过推断.
Pair<String> p = new Pair<>("str1","str2");
2 定义泛型方法
定义一个带有类型参数的简单泛型方法
泛型方法意思是这个方法的参数,返回值可以是任意类型。
class ArrayAlg{ public static <T> T getMiddle(T..a) //<T> 是类型变量,作用是声明这个方法是泛型方法。作用:<T>是用来规范T的,例如<T extends Object>就规定了边界 //T是返回值类型 { .. }}
这个方法是在普通类中定义,所以泛型方法可以定义在普通类中也可以定义在泛型类中。 类型变量放在修饰符后面,返回类型前面。
如何调用泛型方法?
//当调用一个泛型方法时候,在方法名前的<>中放入具体的类型String middle = ArrayAlg.<String>getMiddle("str1","str2");//但在实际中,可以省略<>,因为编译器可以根据上下文自动推断出泛型类型。String middle = ArrayAlg.getMiddle("str1","str2");
番外:泛型类中的方法与泛型方法
使用:
泛型类,是在实例化类的时候指明泛型的具体类型;
泛型方法,是在调用方法的时候指明泛型的具体类型。
可能有些人既然已经有了泛型类为什么还要使用泛型方法呢?
因为泛型类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而泛型方法可以在调用的时候指明类型,更加灵活。
3 类型变量的限定
有时候,类和方法需要对类型变量进行限定。
为什么呢要对类型变量进行限定?
往下面看,举个例子:
//求数组中的最小值class ArrayAlg{ public static <T> min(T[] a){ if(a == null || a.length() == 0) return null; T smallest = a[0]; for(int i = 0; i < a.length; i ++){ if(smallest.comapreTo(a[i]) > 0){ smallest = a[i]; } } return smallest; } }
因为min()方法中的smallest变量调用了compareTo 方法。怎么确保T所属的类有compareTo()方法?所以 泛型T可以是实现了comparable接口的类。 为了保证这个,就需要对类型变量进行限定。
public static <T extends Comparable> T min(T[] a)...
正如上面代码,类型变量的限制必须使用 extends关键字。不能用implements,即使Comparable为接口。 extends表示T是绑定类型的子类型,T与绑定类型可以是类也可以是接口。
限定中可以有多个接口但是最多有一个类(单继承)。extends可以接多个接口超类型,但是至多有一个类,如果extends后面跟有类,这个类必须是第一个。
另外,一个类型变量可以有多个限定。
<T extends Comparable & Serializable>//限定类型用&分割,逗号用来分割类型变量。
类型遍历限定的例子
package pair2;import java.time.*;/** * @version 1.02 2015-06-21 * @author Cay Horstmann */public class PairTest2{ public static void main(String[] args) { LocalDate[] birthdays = { LocalDate.of(1906, 12, 9), // G. Hopper LocalDate.of(1815, 12, 10), // A. Lovelace LocalDate.of(1903, 12, 3), // J. von Neumann LocalDate.of(1910, 6, 22), // K. Zuse }; Pair<LocalDate> mm = ArrayAlg.minmax(birthdays); System.out.println("min = " + mm.getFirst()); System.out.println("max = " + mm.getSecond()); }}class ArrayAlg{ /** Gets the minimum and maximum of an array of objects of type T. @param a an array of objects of type T @return a pair with the min and max value, or null if a is null or empty */ public static <T extends Comparable> Pair<T> minmax(T[] a) { if (a == null || a.length == 0) return null; T min = a[0]; T max = a[0]; for (int i = 1; i < a.length; i++) { if (min.compareTo(a[i]) > 0) min = a[i]; if (max.compareTo(a[i]) < 0) max = a[i]; } return new Pair<>(min, max); }}
以上仅仅是介绍了泛型程序设计的基础知识,还有重点是 在java虚拟机中对泛型的处理,以及类型擦除对于泛型的局限行见
java-泛型程序设计(二)
- java-泛型程序设计(一)
- Java程序设计(一)
- 【java核心技术卷一】泛型程序设计
- Java程序设计基础(一)
- Java基础程序设计(一)
- java - 泛型程序设计(二)
- java-泛型程序设计(三)
- 泛型程序设计实例(一)
- [学习笔记] Java核心技术 卷一:基础知识 泛型程序设计(五)
- Java程序设计知识与技能(一)
- 学习JAVA多线程程序设计(一)
- Java基本的程序设计结构(一)
- java的基本程序设计结构(一)
- JAVA图形程序设计(一)基本框架
- Java高并发程序设计笔记(一)
- java通用程序设计的建议(一)
- Java实践(一)---程序设计基本概念
- 【effective java读书笔记】通用程序设计(一)
- 剑指offer13:在O(1)时间删除链表结点
- Numpy学习笔记之线性代数
- 文章标题 Til the Cows Come Home
- Til the Cows Come Home(POJ 2387)
- 线程同步的方法有哪些(面试题)
- java-泛型程序设计(一)
- ISE与MATLAB的联合使用
- 画图板的课后感想
- 机器学习定义
- vs2013下的python远程调试支持
- getElementsByClassName这个坑
- 分类游戏
- 2017年4月18日今日头条笔试原题C题
- HDU 2089 不要62 (数位DP)