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 ...
随机推荐
- HW3.18
import javax.swing.JOptionPane; public class Solution { public static void main(String[] args) { Str ...
- win7下wubi安装Ubuntu,重装win7后找回Ubuntu启动项
怀念一下我的win7,使用了将近5年,最近终于慢慢处于崩溃且无法修复的状态. 还是重新安装了. 原本是win7下使用wubi安装Ubuntu.重装win7后,肯定没有了Ubuntu的启动项. 具体恢复 ...
- 微软2016校园招聘4月在线笔试 ABC
题目链接:http://hihocoder.com/contest/mstest2016april1/problems 第一题:输入N,P,W,H,代表有N段文字,每段有ai个字,每行有⌊W/S⌋个字 ...
- ActiveMQ内存设置和流控
启动脚本设置jvm的内存 if "%ACTIVEMQ_OPTS%" == "" set ACTIVEMQ_OPTS=-Xms1G-Xmx1G -Djava.ut ...
- common
lexical_cast 提供string2int, int2string, #define(...) 可变宏:-和__VA_ARGS__ 宏定义中参数列表的最后一个参数为省略号(三个英文句号,省略 ...
- 使用HttpClient进行http post/get方法的调用,以及使用dom4j解析xml
import java.io.IOException; import java.util.List; import javax.servlet.ServletInputStream; import j ...
- Delphi 根据快捷方式路径取源文件地址
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...
- RedHat Enterprise Linux 6.4使用Centos 6 的yum源 分类: 服务器搭建 Nginx 2015-07-14 14:11 5人阅读 评论(0) 收藏
转载自:http://blog.sina.com.cn/s/blog_50f908410101cto6.html 思路:卸载redhat自带yum,然后下载centos的yum,安装后修改配置文件 1 ...
- IMP 导入数据报错 OCI-21500 OCI-22275
IMP导入数据报错如下: OCI-21500: internal error code, arguments: [kgepop: no error frame to pop to], [], [], ...
- Android用悬浮按钮实现翻页效果
今天给大家分享下自己用悬浮按钮点击实现翻页效果的例子. 首先,一个按钮要实现悬浮,就要用到系统顶级窗口相关的WindowManager,WindowManager.LayoutParams.那么在An ...