jdk5新特性之泛型

1、泛型简单例子
public void method1(){
ArrayList<Integer> aList = new ArrayList<Integer>();
aList.add(new Integer(1));

//试图加入其它类型的数据,编译器报错
//aList.add(new Object());
// ...
Integer myInteger = aList.get(0);
}
2、自定义泛型
public class TestGenerics<E> {
Collection<E> col = new ArrayList<E>();

public void doSth(E elem) {
col.add(elem);
// ...
}

}
3、泛型API定义
API定义:
public interface Iterable<T> {…}

public interface Collection<E> extends Iterable<E> {……}

public abstract class AbstractCollection<E> implements Collection<E> {……}
4、泛型误区
在泛型的使用中,有一个很容易产生的误解,那就是既然 Integer是从 Object 派生出来的,那么ArrayList<Integer>当然就是 ArrayList<Object>的子类。真的是这样吗?
仔细想一想就会发现这样做可能会带来的问题:如果我们可以把 ArrayList<Integer>向上转型为 ArrayList<Object>,那么在往这个转了型以后的 ArrayList 中添加对象的时候,我们岂不是可以添加任何类型的对象(因为Object 是所有对象的公共父类)?这显然让我们ArrayList<Integer>失去了原本的意义。于是 Java编译器禁 止我们这 样做。
5、泛型通配符
那么什么是各种ArrayList的父类呢?它写作: ArrayList<?>(发音为:“arraylist of unknown"),就是,一个集合,它的元素类型可以匹配任何类型。显然,它被称为通配符。我们可以写:
void printCollection(ArrayList <?> c) {
for (Object e : c) {
System.out.println(e);
}
}
现在,我们可以使用任何类型的collection来调用它。注意,我们仍然可以读取c中的元素,其类型是Object。这永远是安全的,因为不管collection的真实类型是什么,它包含的都是objects。但是将任意元素加入到其中不是类型安全的:
Collection<?> c = new ArrayList<String>();
c.add(new Object()); // 编译时错误
因为我们不知道c的元素类型,我们不能向其中添加对象。
add方法有类型参数E作为集合的元素类型。我们传给add的任何参数都必须是一个未知类型的子类。因为我们不知道那是什么类型,所以我们无法传任何东西进去。唯一的例外是null,它是所有类型的成员。
另一方面,我们可以调用get()方法并使用其返回值。返回值是一个未知的类型,但是我们知道,它总是一个Object,因此把get的返回值赋值给一个Object类型的对象或者放在任何希望是Object类型的地方是安全的。
6、泛型的范围限定
所有的图形通常都有很多个形状。假定它们用一个list来表示,Canvas里有一个方法来画出所有的形状会比较方便:
      public void drawAll(List<Shape> shapes) {
          for (Shape s : shapes) {
             s.draw(this);
         }
}
现在,类型规则导致drawAll()只能使用Shape的list来调用。它不能,比如说对List<Circle>来调用。这很不幸,因为这个方法所作的只是从这个list读取shape,因此它应该也能对List<Circle>调用。我们真正要的是这个方法能够接受一个任意种类的shape:
public void drawAll(List<? extends Shape> shapes) { //..}
7、泛型注意点
(1) 在定义一个泛型类的时候,在 “<>”之间定义形式类型参数,例如:“class TestGen<K,V>”,其中“K” , “V”不代表值,而是表示类型。 (2) 实例化泛型对象的时候,一定要在类名后面指定类型参数的值(类型),一共要有两次书写。例如:TestGen<String,String> t=new TestGen<String,String>(); (3) 泛型中<K extends Object>,extends并不代表继承,它是类型范围限制。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值