现在的位置: 首页 > 综合 > 正文

Java泛型扫盲(zz)

2014年01月05日 ⁄ 综合 ⁄ 共 2151字 ⁄ 字号 评论关闭

     


Java SE1.5
中,
增加了一个新的特性:泛型(日本语中的总称型)。何谓泛型呢?通俗的说,就是泛泛的指定对象所操作的类型,而不像常规方式一样使用某种固定的类型去指定。
泛型的本质就是将所操作的数据类型参数化,也就是说,该数据类型被指定为一个参数。这种参数类型可以使用在类、接口以及方法定义中。

 

一、



为什么使用泛型呢?


    

在以往的
J2SE
中,没有泛型的情况下,通常是使用
Object
类型来进行多种类型数据的操作。这个时候操作最多的就是针对该
Object
进行数据的强制转换,而这种转换是基于开发者对该数据类型明确的情况下进行的(比如将
Object
型转换为
String
型)。倘若类型不一致,编译器在编译过程中不会报错,但在运行时会出错。

   


使用泛型的好处在于,它在编译的时候进行类型安全检查,并且在运行时所有的转换都是强制的,隐式的,大大提高了代码的重用率。

 

二、




泛型的简单例子:


首先,我们来看看下面两个普通的
class
定义

 

   

这两个
class
除了所操作的数据类型不一致,其他机能都是相同的。现在,我们可以使用泛型来将上面两个
class
合并为一个,从而提高代码利用率,减少代码量。


 

   

那么,使用了泛型后,如何生成这个
class
的实例来进行操作呢?请看下面的代码:

       

getObj<String> strObj = new getObj<String>();

       
strObj.setObj(“Hello Nissay”);

       
System.out.println(strObj.getObj());

 

        
getObj<Double> douObj = new getObj<Double>();

        
douObj.setObj(new Double(“116023”));

        
System.out.println(douObj.getObj());

 

三、
 



例子分析


现在我们来分析上面代码2:

1、

<T>
是泛型的标记,当然可以使用别的名字,比如
。使用
<T>
声明一个泛型的引用,从而可以在
class
、方法及接口中使用它进行数据定义,参数传递。

2、

<T>
在声明的时候相当于一个有意义的数据类型,编译过程中不会发生错误;在实例化时,将其用一个具体的数据类型进行替代,从而就可以满足不用需求。

 

四、



泛型的规则和限制


通过上述的例子,我们简单理解了泛型的含义。在使用泛型时,请注意其使用规则和限制,如下:

1、

泛型的参数类型只能是类(
class
)类型,而不能是简单类型。

     

比如,
<int>
是不可使用的。

2、

可以声明多个泛型参数类型,比如
<T, P,Q…>
,同时还可以嵌套泛型,例如:
<List<String>>

3、

泛型
的参数

型可以使用
extends

句,例如
<T extends superclass>

4、

泛型的参数类型可以使用
super
语句,例如
< T super childclass>

5、

泛型还可以使用通配符,例如
<? e
xtends ArrayList>

 

五、




扩展


1、

extends
语句

使用
extends
语句将限制泛型参数的适用范围。例如:

<T extends collection>
,则表示该泛型参数的使用范围是所有实现了
collection
接口的
calss
。如果传入一个
<String>
则程序编译出错。

2、

super
语句

super
语句的作用与
extends
一样,都是限制泛型参数的适用范围。区别在于,
super
是限制泛型参数只能是指定该
class
的上层父类。

例如
<T super List>
,表示该泛型参数只能是
List

List
的上层父类。

3、

通配符

使用通配符的目的是为了解决泛型
参数
被限制死了不能
动态
根据

例来确定的缺点

举个例子:
public class SampleClass < T extends S> {…}

假如
A

B

C

…Z

26

class
都实现了
S
接口。我们使用时需要使用到这
26

class
类型的泛型参数。那实例化的时候怎么办呢?依次写下

SampleClass<A> a = new SampleClass();

SampleClass<B> a = new SampleClass();


SampleClass<Z> a = new SampleClass();

这显然很冗余,还不如使用
Object
而不使用泛型,呵呵,是吧?

别着急,咱们使用通配符,就
OK
了。

SampleClass<? Extends S> sc = new SampleClass();



抱歉!评论已关闭.