Java泛型Word下载.docx

上传人:b****4 文档编号:17607042 上传时间:2022-12-07 格式:DOCX 页数:45 大小:39.24KB
下载 相关 举报
Java泛型Word下载.docx_第1页
第1页 / 共45页
Java泛型Word下载.docx_第2页
第2页 / 共45页
Java泛型Word下载.docx_第3页
第3页 / 共45页
Java泛型Word下载.docx_第4页
第4页 / 共45页
Java泛型Word下载.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

Java泛型Word下载.docx

《Java泛型Word下载.docx》由会员分享,可在线阅读,更多相关《Java泛型Word下载.docx(45页珍藏版)》请在冰豆网上搜索。

Java泛型Word下载.docx

private 

ob;

//定义泛型成员变量 

3. 

 

4. 

public 

Gen(T 

ob) 

5. 

this.ob 

6. 

7. 

8. 

getOb() 

9. 

return 

10. 

11. 

12. 

void 

setOb(T 

13. 

14. 

15. 

16. 

showTyep() 

17. 

System.out.println("

T的实际类型是:

"

ob.getClass().getName());

18. 

19.} 

20. 

21.public 

GenDemo 

22. 

static 

main(String[] 

args){ 

23. 

//定义泛型类Gen的一个Integer版本 

24. 

Integer>

intOb=new 

(88);

25. 

intOb.showTyep();

26. 

int 

i= 

intOb.getOb();

27. 

value= 

i);

28. 

29. 

----------------------------------"

);

30. 

31. 

//定义泛型类Gen的一个String版本 

32. 

String>

strOb=new 

("

Hello 

Gen!

33. 

strOb.showTyep();

34. 

String 

s=strOb.getOb();

35. 

s);

36. 

37.} 

publicclassGen<

{

privateTob;

//定义泛型成员变量

publicGen(Tob){

this.ob=ob;

}

publicTgetOb(){

returnob;

publicvoidsetOb(Tob){

publicvoidshowTyep(){

System.out.println("

"

+ob.getClass().getName());

}

publicclassGenDemo{

publicstaticvoidmain(String[]args){

//定义泛型类Gen的一个Integer版本

Gen<

intOb=newGen<

intOb.showTyep();

inti=intOb.getOb();

value="

+i);

//定义泛型类Gen的一个String版本

strOb=newGen<

HelloGen!

strOb.showTyep();

Strings=strOb.getOb();

+s);

例二:

没有使用泛型时:

Gen2 

Object 

//定义一个通用类型成员 

Gen2(Object 

setOb(Object 

21. 

22.public 

GenDemo2 

args) 

//定义类Gen2的一个Integer版本 

intOb 

new 

Gen2(new 

Integer(88));

(Integer) 

//定义类Gen2的一个String版本 

strOb 

Gen2("

(String) 

strOb.getOb();

37. 

38.} 

publicclassGen2{

privateObjectob;

//定义一个通用类型成员

publicGen2(Objectob){

publicObjectgetOb(){

publicvoidsetOb(Objectob){

publicclassGenDemo2{

publicstaticvoidmain(String[]args){

//定义类Gen2的一个Integer版本

Gen2intOb=newGen2(newInteger(88));

inti=(Integer)intOb.getOb();

//定义类Gen2的一个String版本

Gen2strOb=newGen2("

Strings=(String)strOb.getOb();

运行结果:

两个例子运行Demo结果是相同的,控制台输出结果如下:

T的实际类型是:

java.lang.Integer

value=88

----------------------------------

java.lang.String

value=HelloGen!

Processfinishedwithexitcode0

补充:

实际上泛型可以用得很复杂,复杂到编写代码的人员自己也难以看懂。

这往往是对泛型的滥用或者类或接口本身设计不合理导致的。

看来用好泛型还真不容易,为此必须从根源说起。

一、逐渐深入泛型

1、没有任何重构的原始代码:

有两个类如下,要构造两个类的对象,并打印出各自的成员x。

StringFoo 

x;

StringFoo(String 

x) 

this.x 

getX() 

setX(String 

15.} 

17.public 

DoubleFoo 

Double 

19. 

DoubleFoo(Double 

setX(Double 

31.} 

publicclassStringFoo{

privateStringx;

publicStringFoo(Stringx){

this.x=x;

publicStringgetX(){

returnx;

publicvoidsetX(Stringx){

publicclassDoubleFoo{

privateDoublex;

publicDoubleFoo(Doublex){

publicDoublegetX(){

publicvoidsetX(Doublex){

2、对上面的两个类进行重构,写成一个类:

因为上面的类中,成员和方法的逻辑都一样,就是类型不一样,因此考虑重构。

Object是所有类的父类,因此可以考虑用Object做为成员类型,这样就可以实现通用了,实际上就是“Object泛型”,暂时这么称呼。

ObjectFoo 

ObjectFoo(Object 

setX(Object 

15.} 

publicclassObjectFoo{

privateObjectx;

publicObjectFoo(Objectx){

publicObjectgetX(){

publicvoidsetX(Objectx){

写出Demo方法如下:

ObjectFooDemo 

main(String 

args[]) 

strFoo 

ObjectFoo("

Generics!

douFoo 

ObjectFoo(new 

Double("

33"

));

objFoo 

Object());

strFoo.getX="

+(String)strFoo.getX());

douFoo.getX="

+(Double)douFoo.getX());

objFoo.getX="

+(Object)objFoo.getX());

11.} 

publicclassObjectFooDemo{

publicstaticvoidmain(Stringargs[]){

ObjectFoostrFoo=newObjectFoo("

HelloGenerics!

ObjectFoodouFoo=newObjectFoo(newDouble("

ObjectFooobjFoo=newObjectFoo(newObject());

运行结果如下:

strFoo.getX=HelloGenerics!

douFoo.getX=33.0

objFoo.getX=java.lang.Object@19821f

解说:

在Java5之前,为了让类有通用性,往往将参数类型、返回类型设置为Object类型,当获取这些返回类型来使用时候,必须将其“强制”转换为原有的类型或者接口,然后才可以调用对象上的方法。

3、Java5泛型来实现

强制类型转换很麻烦,我还要事先知道各个Object具体类型是什么,才能做出正确转换。

否则,要是转换的类型不对,比如将“HelloGenerics!

”字符串强制转换为Double,那么编译的时候不会报错,可是运行的时候就挂了。

那有没有不强制转换的办法----有,改用Java5泛型来实现。

GenericsFoo<

GenericsFoo(T 

setX(T 

GenericsFooDemo 

args[]){ 

strFoo=new 

Double>

douFoo=new 

(new 

Object>

objFoo=new 

+strFoo.getX());

+douFoo.getX());

+objFoo.getX());

27.} 

publicclassGenericsFoo<

privateTx;

publicGenericsFoo(Tx){

publicTgetX(){

publicvoidsetX(Tx){

publicclassGenericsFooDemo{

publicstaticvoidmain(Stringargs[]){

GenericsFoo<

strFoo=newGenericsFoo<

douFoo=newGenericsFoo<

(newDouble("

objFoo=newGenericsFoo<

(newObject());

strFoo.getX=HelloGenerics!

和使用“Object泛型”方式实现结果的完全一样,但是这个Demo简单多了,里面没有强制类型转换信息。

下面解释一下上面泛型类的语法:

使用<

来声明一个类型持有者名称,然后就可以把T当作一个类型代表来声明成员、参数和返回值类型。

当然T仅仅是个名字,这个名字可以自行定义。

classGenericsFoo<

声明了一个泛型类,这个T没有任何限制,实际上相当于Object类型,实际上相当于classGenericsFoo<

TextendsObject>

与Object泛型类相比,使用泛型所定义的类在声明和构造实例的时候,可以使用“<

实际类型>

”来一并指定泛型类型持有者的真实类型。

类如

当然,也可以在构造对象的时候不使用尖括号指定泛型类型的真实类型,但是你在使用该对象的时候,就需要强制转换了。

比如:

Generi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学反思汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1