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 ...
随机推荐
- HW2.25
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- 小波变换和motion信号处理(三)(转)
这篇文章算太监了,去作者blog提问去吧:http://www.kunli.info/2012/04/08/fourier-wavelet-motion-signal-3/ 从前两篇发布到现在,过去一 ...
- Jquery Ajax的时候 老是返回到 error,是因为json格式不正规的原因
Jquery Ajax的时候 老是返回到 error,是因为json格式不正规的原因: 怪不得不执行,原来我返回的是{success:true,id:1} 这种不规则的字符串,不是严格的json格式, ...
- Microsoft SQL Server Data Tools - Business Intelligence for Visual Studio 2013 http://www.microsoft.com/en-us/download/details.aspx?id=42313
Microsoft SQL Server Data Tools - Business Intelligence for Visual Studio 2013 http://www.microsoft. ...
- Hadoop概念学习系列之如何去找到历史版本的Hadoop发行包(三十四)
如何去找到历史版本的Hadoop发行包 找到Hadoop历史版本 这里我需要的Hadoop版本是2.0.3.打开hadoop的下载页面 http://www.apache.org/dyn/closer ...
- Redis常用数据类型
Redis常用数据类型 转载自:http://blog.sina.com.cn/s/blog_7f37ddde0101021q.html Redis最为常用的数据类型主要有以下五种: ●Str ...
- 读取xml格式文件
$v = [xml]get-content d:\vmconfig.xml $v.Domain.Computer.Name =========================== $v.GetElem ...
- 【Servlet】Servlet应用的get、post访问及和JSP的配合使用
Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面. 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用 ...
- 真相:中国版BBB用USB连电脑没有盘符的根本原因分析
很多网友在问:为什么中国版的装完驱动插上板子没有显示端口号和69M的盘符??楼主发现,在开机启动的时候,加载g_multi模块时出现错误提示 invalid argument. Emb ...
- Copy-On-Write技术 (摘录)
Copy-On-Write技术 Copy-On-Write是写时才copy的意思,有延迟操作的意思在里面.比如往磁盘写数据,先写到的是内存里面,只有文件close或flush时才真正写到磁盘. ...