发新话题

老紫竹JAVA提高教程-泛型的使用(2)限制参数类型

前面的例子里,泛型里的参数(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
快乐渡过每一天,减肥坚持每一天



编辑 回复 快速回复 TOP
斑竹谢谢了,我看了你的文章受益匪浅,非常感谢您!写的非常的好!加油!
编辑 回复 快速回复 TOP
发新话题