载入中...
这几年就这么浑浑噩噩的过来了。回首起来,白驹过隙。
类型擦除(Type Erasure)
当我们实例化一个泛型的时候,编译器使用一种叫做类型擦除(type erasure)的技术。在类型擦除的过程中,编译器会去除掉类与接口中所有和类型参数有关的信息。类型擦除使得用泛型的java应用程序能够和该泛型创建之前就存在的java库和应用程序相兼容。……
通配符
在泛型中,我们可以用一个通配符”?”来代替一个未知的类型。例如,使用下面的代码为某种animal指定一个cage:
Cage<? extends Animal> someCage = ...;
"? extends Animal"表示一种未知的类型,它可能是animal的一种子类型,也可能是animal自己本身,总的来讲就是某种animal。上面的例子是一种受限通配符,它的上限就是Animal。如果需要装下某种animal的cage,那么就可以被用作是lion cage或者butterfly cage。……
泛型的子类型
只要两种类型能够相符,我们可以把一种类型的对象赋给另外一种类型的对象。例如,可以把一个Integer赋给一个Object,因为Object是Integer的父类之一。
Object someObject = new Object();
Integer someInteger = new Integer(10);
someObject = someInteger; // OK
……
受限的类型参数(Bounded Type Parameters)
有时候,我们要限制传递给类型参数的具体参数。例如,对数进行操作的方法就只能接受Number或者其子类的对象作为改方法的参数,而不能接受其他类型的参数。这也就是要对参数类型进行限制的原因。
在申明一个类型参数的时候,如果在类型参数名后跟着extends关键字,而extends关键字后面又跟着类型参数的上限(upper bound),例如这个上限可以是个数类Number,那么这个被申明的类型参数就是一个受限的参数类型。需要注意的是,这里的extends关键字可以是普通意义上类“继承”的意思,也可以是接口上“实现”的意思。……
泛型方法和构造器
如果在申明方法或者构造器的时候使用类型参数的话,就可以定义泛型方法和泛型构造器。这和定义一个普通的泛型基本上无二样,除了类型参数的作用范围只是在定义它的方法或者构造器之中。……
我们可以通过将"public class Box" 修改为 "public class Box<T>"而定义一个泛型,在这个定义中,使用了一个类型变量(type variable) T,而且T能够在Box类之内的任何地方被使用。这中定义的方法其实并不复杂,并且在接口(interface)中也被使用。实际上,T可以看作是一种特殊的数据类型,它的值就是我们要传递给它的参数,参数的类型可以是类,也可以是接口,或者其他类型的变量,但是却不能是原始类型(primitive)的数据。……
从今天开始学习Java的泛型(Generics),它能够帮助程序员书写更加可靠的程序和软件。
1. 介绍
通常,缺陷严重影响着大型程序和软件的使用。通过周密的设计、编码和测试,或许可以减少一些缺陷,但是缺陷对程序来讲简直就是无孔不入,特别是在要引入一些新的特性或者程序越来越大越来越复杂的时候。值得我们高兴的是有些缺陷能很容易被发现,这给我的工作带来了极大的方便。例如编译时的缺陷能够立刻告诉我们某个地方有错误,我们也可以通过编译输出的错误信息判断和找出错误所在,并且修改它。运行时的缺陷就没有那么好对付了,因为它们隐藏的很深,喜欢和我们玩捉秘藏,往往很难被发现,有时即使在某些时候我们发现了它们,要找到产生它们原因的道路还很曲折。泛型(Generics)能够帮助我们在编译程序的时候就发现更多的缺陷。……
3.字符串的比较
字符串类为我们提供了很多字符串之间进行比较或者字符串与字符串的一部分进行比较的方法。掌握这些方法可以帮助我们快速的完成字符串比较的相关工作。具体介绍如下表所示,同样下面也不包括和正则表达式有关的比较方法。……
上个月中旬开始学习java,不是因为我要用他。只是觉得它是一种优秀的面向对象的高级编程语言,而且用它写的程序可以做到跨平台使用,所以就想学习一下,扩展一下自己的思维。为了能和大家讨论和分享我的学习体会,所以将我的笔记发上来,前一段时间的学习笔记都是用英文做的,就不发了,从今天开始。我学习的主要资料来源是http://java.sun.com/docs/books/tutorial/。……