泛型程序设计

在JDK5.0之前:

public class ArrayList{
    public Object get(int i){...}
    public void add(Object o){...}
    ...
    private Object[] elementData;
}

这样实现有两问题。首先,当取得一个值的时候必须进行强制类型转换。

ArrayList files = new ArrayList();

...

String filename = (String)names.get(0);

此外,这里没有错误检查。可以向数组列表中添加任何类的对象。

files.add(new File("..."));

对于这个调用,编译和运行都不会出错。然而在其他地方,如果将get的结果强制类型转换为String类型,就会产生一个错误。

JDK5.0提供了一个更好的解决方案:类型参数(type parameter)。ArrayList类有一个类型参数用来指示元素的类型:ArrayList<String> files = new ArrayList<String>();

这将使代码具有更好的可读性。人们一看就知道这个数组列表中包含的是String对象,添加错误的类型会编译报错,取出元素也不需强制类型转换。类型参数的魅力在于,使得程序具有更好的可读性和安全性。

泛型类的自定义:

public class Pair<T>{
    private T first;
    private T second;
    public Pair(){
        first = null;
        second = null;
    }
    public T getFirst(){
        return first;
    }
    public T getSecond(){
        return second;
    }
    public void setFirst(T newValue){
        first = newValue;
    }
    public void setSecond(T newValue){
        second = newValue;
    }
}

Pair类引入了一个类型变量T,用尖括号(<>)括起,并放在类名的后面。泛型类可以有多个类型变量,例如:public class Pair<T,U>{...}

泛型方法:

class ArrayAlg{
    public static <T> T getMiddle(T[] a){
	    return a[a.length/2];
	}
}

这个方法是在普通类中定义的,而不是在泛型类中定义的。注意,类型变量放在修饰符(这里是public static)的后面,返回类型的前面。

当调用一个泛型方法时,在方法名前的尖括号中放入具体的类型:

String[] names = {"John","Q","Public"};

String middle = ArrayAlg.<String>getMiddle(names);(其中<String>可省略)

类型变量的限定:

有时,类或方法需要对类型变量加以约束:

class ArrayAlg{
    public static <T extends Comparable> T min(T[] a){
	    if(a == null || a.length == 0){
		    return null;
	    }
	    T smallest = a[0];
	    for(int i=1;i<a.length;i++){
		    if(smallest.compareTo(a[i])>0){
		        smallest = a[i];
		    }
		}
	    return smallest;
	}
}

类型T要想有compareTo方法,必须继承Comparable接口。

一个类型变量或通配符可以有多个限定,如:T extends Comparable & Serializable。

泛型程序设计,布布扣,bubuko.com

时间: 2024-10-07 22:43:16

泛型程序设计的相关文章

泛型程序设计---泛型类的定义

泛型程序设计,程序设计都明白什么意思,那泛型呢?什么是泛型? 所谓泛型是指:额...好吧,说不清...举个例子吧:古代的宗教道教中有一句话,道生一,一生二,二生三,三生万物.这里的道即对应程序设计中的泛型,泛型很抽象,我也说不出所以然...(大家可以在文章下方留言讨论) 那么怎么定义泛型类呢? 语法如下: 在看语法之前,需要先了解 类型变量的概念.所谓类型变量是指:可以代替任何类型的一个变量,在定义时,可以使用字符(一般大写,且一般用T及其附近的字符):实际,声明泛型类的变量时,需要使用具体的类

(十七)泛型程序设计

为什么使用泛型程序设计 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用. 定义简单的泛型类 一个泛型类就是具有 “一个或多个类型变量” 的类. 以下定义一个泛型类: 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.seco

12 泛型程序设计

为什么要使用泛型程序 泛型程序设计, 意味着编写的代码可以被很多不同类型的对象所重用. 例如, 我们并不希望为聚集String和File对象分别设计不同的类, 实际上,也不需要这样做, 因为一个ArrayList类可以聚集任何类型的对象, 这是一个泛型程序设计的实例. 没有泛型以前, ArrayList维护的时一个object类型的数组, 这样当获取一个值时, 必须使用强制类型转换. (并非类型判断, 而是强制的类型转换) 简单的泛型类定义 public class Pair<T> { pub

Java基础语法&lt;十二&gt; 泛型程序设计

1 意义 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用. 常见应用 : ArrayList 2 K T V E ? object等的含义 类型变量使用大写形式 E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类)(需要时还可以用临近的字母U和S)表示任意类型  S.U.V – 2nd.3rd.4th types K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定的java类型(无限制通配

C++ Primer 学习笔记_46_STL剖析(一):泛型程序设计、什么是STL、STL六大组件及其关系

一.泛型程序设计 1.泛型编程(generic programming):相同的逻辑和算法,对不同类型的数据进行处理 2.将程序写得尽可能通用 3.将算法从数据结构中抽象出来,成为通用的 4.C++的模板为泛型程序设计奠定了关键的基础 二.什么是STL 1.STL(Standard Template Library),即标准模板库,是一个高效的C++程序库. 2.包含了诸多在计算机科学领域里常用的基本数据结构和基本算法.为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性 3

基础知识(12)- 泛型程序设计

12.1 为什么要使用泛型程序设计 12.2 定义简单泛型类 12.3 泛型方法 12.4 类型变量的限定 12.5 泛型代码和虚拟机  12.5.1 翻译泛型表达式  12.5.2 翻译泛型方法  12.5.3 调用遗留代码 12.6 约束与局限性  12.6.1 不能用基本类型实例化类型参数  12.6.2 运行时类型查询只适用于原始类型  12.6.3 不能创建参数化类型的数组  12.6.4 Varargs警告  12.6.5 不能实例化类型变量  12.6.6 泛型类的静态上下文中类型

浅谈泛型程序设计

一.为什么要使用泛型程序设计 1.泛型程序设计:以为这编写代码可以被很多不同类型的对象所重用.例如:我们不必为了聚集String和File而别设计不同的类: 2.使代码具有更好的可读性:ArrayList<String> str = new ArrayList<>(); 人们一看就知道是包含了String对象的数组列表: 二.定义简单的泛型类 泛型类:就是具有一个或多个类型变量的类. 声明语法:public class  ClassName<T> {...} 例: pu

C++ 泛型程序设计与STL模板库(1)---泛型程序设计简介及STL简介与结构

泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数据类型.例如: 将"可以比大小的所有数据类型(有比较运算符)"这一概念记为Comparable 将"具有公有的复制构造函数并可以用'='赋值的数据类型"这一概念记为Assignable 将"可以比大小.具有公有的复制构造函数并可以用'='赋值的所有数据类型"这个概念记

Java核心技术(五) —— 泛型程序设计(2)

本文延续上文,针对泛型程序设计,从以下方面进行讲解: 为何使用泛型程序设计 定义简单的泛型类 泛型方法 类型变量的限定 泛型代码和虚拟机 约束与局限性 泛型类型的继承规则 通配符类型 反射和泛型 4.泛型代码和虚拟机 这里内容比较多且杂,我们先概括几个主要思想: 虚拟机中没有泛型,只有普通的类和方法 所有的类型参数都用他们的限定类型转换 桥方法被合成来保持多态 为保持类型安全性,必要时插入强制类型转换 (1)当定义一个泛型类型时,系统会自动提供一个相应的原始类型.原始类型的名字就是删去类型参数后