泛型是一种抽象级别较高的程序设计机制,它可以将不同类型对象的同一种操作加以抽象、封装,使其有更广泛的代码重用性。是对不同类型数据实施同一种操作的重用体现。在程序设计中,经常遇到不同的数据类型可以实施同一种操作的情形。
1本关任务-定义泛型类
补充完成右侧泛型程序设计代码,并通过测试。
提示
泛型的定义:
public class A< T>{
private T t;
public A(T t){this.t=t;}
public T getT(){return t;}
public void setT(T t){this.t=t;}
public String toString(){return " "+t;}
}
在这个类中引入了类型参数T,这个参数书写在类名之后并用一对尖括号括起来。 有了这个定义就可以按照下列方式使用它。
A i= new A<Integer>(new Integer(20));
A s= new A<String>("Hello");
A d= new A<Double>(3.0);
i.getT();
s.getT();
d.getT();
System.out.println(i+" "+s+" "+d);}
输出结果:20 Hello 3.0
说明:在类A的定义中,没有指定数据成员t必须是某一种特定类型,而将其定义为了泛型数据T,只有在使用时,即测试类中才具体指定,对数据类型定义。
在测试类中,定义类A的对象,i,s,d时,将类型参数T替换为Integer,表示类中所有T的位置都为Integer;将类型参数T替换为String,表示类中所有T的位置都为String,这样既能让各种类型重用同一段程序代码,又可以避免人为地强制类型转换带来的错误。
注意
在实例化泛型类时不允许带入基本数据类型。例如,A< double>是错误的,必须写成A< Double>。
过关提示
有时需要对参数类型加以限定。例如,要求带入的类必须具有比较大小的功能,即这些类必须实现Comparable接口。表示这种限定的格式为:
public class A < T extends Comparable>{
...
}
< T extends Comparable>的含义是T限定为Comparable的子类。注意,尽管Comparable是接口,但在这里用extends关键字,而不用implements关键字。
本关中需要实现compare()方法,返回两个对象中较大者。用到了下面的compareto()方法,其中obj1,obj2是两个类型相同的对象。
obj1.compareTo(obj2)返回大于0,小于0,等于0的值,代表对象obj1大于、小于和等于对象obj2。
编程要求
补充完成右侧泛型程序设计代码,定义泛型类,实现两个对象的比较,并输出最大者。输入的数据可能是整数,也可能是浮点数,也可能是字符串。
字符串比大小,按照字母顺序,如c>a。
开始你的任务吧,祝你成功!
答案代码:
package step1;
public class A< T extends Comparable >{
private T t1,t2;
/*************BEGIN**************/
public A(T t1, T t2) {
this.t1 = t1;
this.t2 = t2;
}
public T getT1() {
return t1;
}
public T getT2() {
return t2;
}
public void setT(T t1, T t2) {
this.t1 = t1;
this.t2 = t2;
}
public T compare(){
if(t1.compareTo(t2) >= 0) return t1;
else return t2;
}
@Override
public String toString() {
return ""+t1+""+t2;
}
/*************END*****************/
}
2本关任务-泛型使用
根据泛型类A的定义,补充完成右侧测试类代码。类A的定义可通过右侧文件夹查看。
测试类A_Test中,定义了集合类ArrayList的对象array来完成操作,将输入的5对数作为array的元素顺序加入,之后按要求输出每一对儿数,并输出每一对儿数中较大者。
ArrayList操作:
get(i):获取第i个元素。
add(i):将元素加入ArrayList
相关知识
List和ArrayList都属于集合Collection的子类,可存储不同类型的数据。因此,可以将集合中的数据用泛型表示。如:
例1:
使用泛型:
List<T> list=new ArrayList<T>();
T t=list.get(0);
不使用泛型:
List list=new ArrayList();
T t=(T)list.get(0);
由于可以向list中添加任何类对象,如不使用泛型,在后面的使用中,很可能会出现类型转化的错误。
list.add("World");
list.add("Hello");
String str1 = (String) list.get(0);
Integer value=(Integer)list.get(1);
显然,list.get(1) 应该返回String类对象的引用,所以将其强制转换为Integer类是错误的。
例2:
使用了泛型:
ArrayList <Student> array = new ArrayList();
for(int i=0;i<array.size();i++){
Student student=array.get(i);//不需要强制类型转换
}
不加泛型:
ArrayList array = new ArrayList();
for(int i=0;i<array.size();i++){
Student student=(Student)array.get(i);//需要强制类型转换
}
编程要求
补充右侧程序,实现获取输入5组数据,比较每组数据的大小,输出大的,并且将5组数据输出。
要求用ArrayList结合泛型类A,实现对输入的一对数据进行比较,如:(3,a),(6,5.388),并按照字符串比大小的规则,输出大的那个。数据类型可以不同,按照字符比大小的规则,a-z,顺序在前的小,后面的大。两个以上的,先比第一个,然后比第二个。如:a<b,aa<ab,abc<abd
开始你的任务吧,祝你成功!
答案代码
package step1;
import java.util.*;
public class A_Test {
public static void main(String args[]){
Scanner scan=new Scanner(System.in);
ArrayList<A> array=new ArrayList<A>();
String s1,s2;
for(int i=0;i<5;i++){
/******************BEGIN*************/
s1 = scan.next();
s2 = scan.next();
array.add(new A<String>(s1, s2));
/******************END*************/
}
/******************BEGIN*************/
System.out.println(array.toString());
for (A num:
array) {
System.out.println(num.toString()+ ": "+num.compare()+" is bigger");
}
/******************END*************/
}
}