泛型(Generics Types)学习笔记<一>

本文是关于Java 1.5泛型的学习笔记。介绍了泛型编译后会产生不同类型声明,如List<Integer>和List<Boolean>;指出List<String>不是List<Object>的子类型;说明了泛型的父类型是通配符类型Collection<?>;还提及有限制的通配符类型<? extends Class>及其只读特性。

Generics Types 泛型学习笔记 1

作者:冰云 icecloud(AT)sina.com
BLOG: http://icecloud.51.net

时间:2004.02.15

 

版权声明:

本文由冰云完成,首发于优快云,作者保留中文版权。
未经许可,不得使用于任何商业用途。
欢迎转载,但请保持文章及版权声明完整。
如需联络请发邮件:icecloud(AT)sina.com

Java 1.5 提供了泛型支持。前几天,Sun发布了一篇tutorial。以下是对该tutorial的学习笔记。

http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

Generics in the Java Programming Language

Gilad Bracha

Febrary 16, 2004.

 

1 泛型编译后实际上会产生不同的类型声明

 

 

    public interface List<E> {

       void add(E x);

       Iterator<E> iterator();

    }

    public interface Iterator<E> {

       E next();

       boolean hasNext();

    }

   

 

基本的调用

 

    List<Integer> myIntList = new LinkedList<Integer>();

    myIntList.add(new Integer(0));

    Integer x = myIntList.iterator().next();

 

 

 

Note 1: 每个泛型声明仅编译一次,并且为每个不同类型产生一个单独的文件。就像旧的类一样。比如,可能会有List<Integer>类和List<Boolean>类被产生。

原文:A generic type declaration is compiled once and for all, and turned into a single class file, just like an ordinary class or interface declaration.

 

编译后,相当于产生了下面的类

 

    public interface IntegerList {

       void add(Integer x);

       Iterator<Integer> iterator();

    }

 

 

 

 

2 List<String>不是List<Object>的子类型

 

以下语句将无法通过编译,出现错误在第2行,因为lo不是ls的父类型。

 

    List<String> ls = new ArrayList<String>();

    List<Object> lo = ls;

   

    lo.add(new Object();

    String s = ls.get(0);

 

 

Note 2: 一般来说,如果FooBar的子类型,G是泛型类型,那么G<Foo>不是G<Bar>的子类型。书上说这是泛型学习的最大难点。

原文:In general, if Foo is a subtype (subclass or subinterface) of Bar, and G is som generic type declaration, it is not the case that G<Foo> is a subtype of G<Bar>.

 

3泛型的父类型是<?>,通配符类型。

一个用到Collection的泛型方法如下,其中for循环用了新式的方法:

 

    void printCollection(Collection<?> c){

       for (Object e:c)

           System.out.println(e);

    }

 

其中,Collection<?>表示其可以是任何类型。如Collection<Integer>Collection<String>Collection<?>是他们的父类型。

 

Note 3:Collection<?>是所有种类的子类。而不是Collection<Object>。这叫做“wildcard type”通配符类型。

原文:What is the supertype of all kinds of collections? It’s written Collection<?> (pronounced “collection of unknown”), that is, a collection whose element type matches anything. It’s called a wildcard type for obvious reason.

 

4 Bounded wildcards.有限制的通配符类型

 

很不幸,下面的方法调用无法成功。虽然List<Circle>中的每个对象都是Shape类型。

 

    public void drawAll(List<Shape> shapes) {

       for(Shap s:shapes)s.deaw();

    }

    drawAll(List<Circle> circles);

 

 

通过bounded wildcard可以解决:然而这样做会带来一点代价。即,它是只读的,你不能再向List中添加新元素。

 

 

    public void drawAll(List<? extends Shape> shapes){

       // 下面的调用是错误的,只能读

       shapes.add(0,new Circle());

    }  

 

 

Note 4: <? extends Class>是一种限制通配符类型,它可以接受所有<Class>以及Class的子类型。然而调用代价是,只读访问。

原文:We have replaced the type List<Shape> with List<? extends Shape>. Now drawAll() will accept lists of any subclass of Shape. It is an example of a bounded wildcard. It is now illegal to write into shapes in the body of the method.

这是三分之一左右,地铁上看的,后面的还没看。



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值