1. 为何要进行泛型编程?

泛型变成为不同类型集合提供相同的代码!省去了为不同类型而设计不同代码的麻烦!

2. 一个简单泛型类的定义:


 public class PairTest1
{
public static void main(String[] args)
{
String[] arr = {"This","is","the","end","of","the","world"};
Pair<String> mm = ArrayAlg.minmax(arr);
System.out.println("min = " + mm.getFirst());
System.out.println("max = " + mm.getSecond());
}
} class Pair<T>
{
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) {this.first = newValue;}
public void setSecond(T newValue) {this.second = newValue;} private T first;
private T second;
} class ArrayAlg
{
public static Pair<String> minmax(String[] a)
{
if(a == null || a.length == ) return null;
String min = a[];
String max = a[];
for(int i = ; i < a.length; i++)
{
if(min.compareTo(a[i]) > ) min = a[i];
if(max.compareTo(a[i]) < ) max = a[i];
}
return new Pair<String>(min,max);
}
}

上面这段代码中定义了一个泛型类。

2. 泛型函数:

下面是一个泛型函数定义的实例:

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

注意,一个泛型函数可以定义在一个普通类中,也可以定义在一个泛型类中。

注意在上述模板函数的定义中,模板参数变量的位置,是出现在public static 修饰符之后的!

下面是模板函数的调用:

        String[] arr = {"this","is","me"};
String middle = ArrayAlg.<String>getMiddle(arr);
System.out.println(middle);

在实际中,调用泛型函数时并不需要在函数前加上<String>操作符。java会自动进行类型检查,比如上面getMiddle会自动检查出参数arr的类型是String[]的,这样推测出

T的类型是String。

3. 类型变量的约束:

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<T>(min,max);
}

这里为类型变量T添加了约束T extends Comparable,要求T实现Comarable接口中的CompareTo函数!

Java中泛型变量的约束条件是: <T extends BoundingType>, 你可以让T继承一个类,或者继承任意一个接口,或者同时继承一个类和一个接口,但无论如何

不能继承多个类!

4.泛型代码和虚拟机之间的关系:

虚拟机中没有泛型类型的对象,所有的对象都是具体的类型的对象。

当定义了一个泛型类型之后,编译器会自动提供一个相对应的原始类型(raw type):

raw type的类型名和泛型类型名相同,只是泛型类型参数被去掉了。类型变量被替换成成限定类型对象或Object类型对象。

 class Pair<T>
{
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) {this.first = newValue;}
public void setSecond(T newValue) {this.second = newValue;} private T first;
private T second;
}

上面的类型对应的原始类型是:

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

Java面向对象程序设计--泛型编程的更多相关文章

  1. 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  2. 20145212《Java程序设计》实验报告二 《 Java面向对象程序设计》

    20145212 实验二< Java面向对象程序设计> 实验内容 单元测试 三种代码 伪代码 百分制转五分制: 如果成绩小于60,转成"不及格" 如果成绩在60与70之 ...

  3. 20145213《Java程序设计》实验二Java面向对象程序设计实验报告

    20145213<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装,继承,多态 初步掌握UML建模 熟悉S.O. ...

  4. 20145206《Java程序设计》实验二Java面向对象程序设计实验报告

    20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  5. 20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告

    20145308刘昊阳 <Java程序设计>实验二 Java面向对象程序设计 实验报告 实验名称 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面相对象三要素:封 ...

  6. Java程序设计 实验二 Java面向对象程序设计

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1353  姓名:李海空  学号:20135329 成绩:             指导教师:娄嘉鹏 ...

  7. 20145113 实验二 Java面向对象程序设计

    20145113 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 1.初 ...

  8. JAVA课程实验报告 实验二 Java面向对象程序设计

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317 成绩:             指导教师:娄嘉 ...

  9. 20145225唐振远 实验二 "Java面向对象程序设计"

    20145225<Java程序设计> 实验二 Java面向对象程序设计 实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S ...

随机推荐

  1. 利用gdb 调试android jni c动态库

    http://blog.dornea.nu/2015/07/01/debugging-android-native-shared-libraries/ Since I haven't done thi ...

  2. js常用内置对象、Dom对象、BOM对象

    11.html元素事件属性中,如onclick="",双引号里可以是方法条用,可以是js代码(无需加<script>标签) 12.JavaScript内置 对象.属性和 ...

  3. 如何使用iframe实现隐藏的CSRF

    1.攻击者在“页面1”中http://www.b.com/indexb.html中写下如下代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...

  4. android 中view的绘制过程

    view的绘制过程中分别会执行:onMeasure(会多次)计算view的大小,OnLayout(),确定控件的大小和位置 onDraw()绘制view 当Activity获得焦点时,它将被要求绘制自 ...

  5. iOS 使用CLGeocoder获取地理位置

    placemark(MKPlacemark类的对象)其实是geocoder(MKReverseGeocoder类的对象)的一个属性.从geocoder里面取placemark这个和直接取placema ...

  6. Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建

    1. openSUSE是一款优秀的linux. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRjYXN0Y3Bw/font/5a6L5L2T/font ...

  7. [ES6] 22. Const

    'const' keyword is for creating a read only variable, something you can never change once created. ' ...

  8. phpmailer,smtp发送邮件实例(转)

    一,用phpmailer发送邮件 查看复制打印? <?php   include "class.phpmailer.php";    //包函邮件发送类      //邮件发 ...

  9. Android环境变量笔记

    Logcat打印日志 使用方法Log.i(tag, msg);参数tag: 标签.用于识别Logcat的分类(一般可以使用类名作为标签)数msg: 打印的内容 在eclipse中打开logcat标签W ...

  10. 亿能测试白盒安全测试模板V1.0发布

    亿能测试白盒安全测试模板V1.0发布http://automationqa.com/forum.php?mod=viewthread&tid=2911&fromuid=21