Java面向对象程序设计--泛型编程
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面向对象程序设计--泛型编程的更多相关文章
- 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
- 20145212《Java程序设计》实验报告二 《 Java面向对象程序设计》
20145212 实验二< Java面向对象程序设计> 实验内容 单元测试 三种代码 伪代码 百分制转五分制: 如果成绩小于60,转成"不及格" 如果成绩在60与70之 ...
- 20145213《Java程序设计》实验二Java面向对象程序设计实验报告
20145213<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装,继承,多态 初步掌握UML建模 熟悉S.O. ...
- 20145206《Java程序设计》实验二Java面向对象程序设计实验报告
20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...
- 20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告
20145308刘昊阳 <Java程序设计>实验二 Java面向对象程序设计 实验报告 实验名称 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面相对象三要素:封 ...
- Java程序设计 实验二 Java面向对象程序设计
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:李海空 学号:20135329 成绩: 指导教师:娄嘉鹏 ...
- 20145113 实验二 Java面向对象程序设计
20145113 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 1.初 ...
- JAVA课程实验报告 实验二 Java面向对象程序设计
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:韩玉琪 学号:20135317 成绩: 指导教师:娄嘉 ...
- 20145225唐振远 实验二 "Java面向对象程序设计"
20145225<Java程序设计> 实验二 Java面向对象程序设计 实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S ...
随机推荐
- HW5.18
public class Solution { public static void main(String[] args) { System.out.printf("%s\t%s\n&qu ...
- Task任务
- NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)"
原文: http://stackoverflow.com/questions/19874935/afnetworking-2-0-post-issue-cocoa-error-3840json-tex ...
- 解决libpython2.6.so.1.0: cannot open shared object file
文章解决的问题:安装nginx中需要Python2.6的支持,下面介绍如何安装Python2.6,并建立lib的连接. 问题展示:error while loading shared librarie ...
- Linux下OpenSSL 安装
安装环境: 操作系统:CentOs6.3 OpenSSL Version:openssl-1.0.0e.tar.gz 目前版本最新的SSL地址为http://www.openssl.org/sour ...
- java中对map使用entrySet循环
根据JDK5的新特性,用For循环Map,例如循环Map的Key 1 2 3 for(String dataKey : paraMap.keySet()) { System.out.p ...
- Android_消息机制
Android通过Looper.Handler来实现消息循环机制. Android的消息循环是针对线程的,每个线程都可以有自己的消息队列和消息循环. Android系统中的Looper负责管理线程的消 ...
- javascript-智能社-笔记
JavaScript是什么 JavaScript就是修改样式 编写JS的流程 布局:HTML+CSS 属性:确定要修改哪些属性 事件:确定用户做哪些操作(产品设计) 编写JS:在事件中,用JS来修改页 ...
- 赵雅智:js知识点汇总
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhemhpMjEyOQ==/font/5a6L5L2T/fontsize/400/fill/I0 ...
- linux 内核 编绎配制选项详解
http://blog.sina.com.cn/s/blog_8308bc810102ux0j.html