Java泛型Word下载.docx
《Java泛型Word下载.docx》由会员分享,可在线阅读,更多相关《Java泛型Word下载.docx(45页珍藏版)》请在冰豆网上搜索。
private
T
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));
i
(Integer)
//定义类Gen2的一个String版本
strOb
Gen2("
s
(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