前面的例子里,泛型里的参数(T)可以是任何类型,有时我们要限制一下,比如我们只允许字符串的集合作为参数
package other;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* 老紫竹JAVA提高教程-泛型的使用(2)限制参数类型.<br>
* 这一节我们讨论限制泛型的参数类型。
*
* @author 老紫竹 JAVA世纪网(java2000.net)
*
*/
public class Annotation2 {
public static void main(String[] args) {
test();
test2();
}
// 不带泛型的普通测试,有编译期的泛型警告
public static void test() {
MyObjectCollection o = new MyObjectCollection();
List list = new ArrayList();
list.add(1);
o.set(list);
System.out.println(o.get()); // [1]
Set set = new HashSet();
set.add(2);
o.set(set);
System.out.println(o.get()); // [2]
}
// 带泛型测试
public static void test2() {
// 测试不带参数的构造器
MyObjectCollection<List<String>> obj1 = new MyObjectCollection<List<String>>();
List<String> list = new ArrayList<String>();
list.add("abc");
obj1.set(list);
System.out.println(obj1.get()); // [abc]
LinkedList<String> list2 = new LinkedList<String>();
list2.add("xyz");
obj1.set(list2);
System.out.println(obj1.get()); // [xyz]
// 测试带参数的构造器
List<String> list3 = new ArrayList<String>();
list3.add("abcxyz");
MyObjectCollection<Collection<String>> obj2 = new MyObjectCollection<Collection<String>>(
list3);
System.out.println(obj2.get()); // [abcxyz]
// 测试
// 声明是Collection类型,对象是 List类型,是一个子类
// 可是却编译错误
// 泛型的类型定义是不能自动转换的
// 我们后面将使用通配符来解决这个问题
// MyObjectCollection<Collection<String>> obj3 = null;
// obj3 = new MyObjectCollection<List<String>>();
}
}
// 我们这个类,只接受集合的类型,且必须为String的集合
class MyObjectCollection<T extends Collection<String>> {
private T t;
public MyObjectCollection() {
}
public MyObjectCollection(T t) {
this.t = t;
}
// 设置参数
public void set(T t) {
this.t = t;
}
// 读取参数
public T get() {
return t;
}
}
测试:
1 请看带有测试字样的代码,去掉代码的注释看看编译错误
2 可以在MyObjectCollection里面书写更多的有关集合的测试代码,来试验泛型的功能
总结:
通过T extends XXX 我们可以限制参数的范围,用来保证自己的方法可以被顺利调用。
2008-11-13_135156.jpg