码迷,mamicode.com
首页 > 编程语言 > 详细

java中的泛型

时间:2015-02-05 16:20:20      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

1.java中泛型类似于C++中的模板,最主要的目的就是避免重复写代码,实现代码重用。

  例如maxmin函数,maxmin(int,int),maxmin(long,long),maxmin(double,double),因为参数的不同,可能需要分别写三个maxmin.

  使用泛型后public <T>T maxmin(T,T),写一个就行了。

2.java中的泛型只能适用于对象,基本类型如int,long不能使用,必须使用其对象类型Integer,Long.

3.java中的泛型主要是类都是Object的子类,而Object变量可以引用其他子类,所以泛型可以看成以下这种方式

  public Object maxmin(Object,Object)

4.java中的泛型编译后只保留一份代码拷贝.

  而C++的模板虽然我们只写了一份模板代码,但是因为有几个不同的参数的调用,相应的编译

  后就要产生几份对应的代码,例如template<class T> T maxmin(T,T).如果软件中调用了maxmin(int,int)和maxmin(long,long)

  编译后会产生两份代码拷贝。

 

结合代码说明:

public class Test1{
public static void main(String[] args){
Test1 aTest1=new Test1();
//Disp1(123.456);//error
aTest1.Disp1(123.456);
Disp2(345);

Gclass1<String> aGclass1=new Gclass1<String>("abfsf");
aGclass1.Display();

Gclass1<Long> bGclass1=new Gclass1<Long>(12345l);
bGclass1.Display();

Gclass2 aGclass2=new Gclass2("what a fuck object");
aGclass2.Display();

Gclass2 bGclass2=new Gclass2(123.456);
bGclass2.Display();

Gclass4 aGclass4=new Gclass4("this is Gclass4");
Gclass3<Gclass4> aGclass3=new Gclass3<Gclass4>(aGclass4);
aGclass3.Display();

EGclass4 aEGclass4=new EGclass4("this is EGclass4");
Gclass3<EGclass4> bGclass3=new Gclass3<EGclass4>(aEGclass4);
bGclass3.Display();

}

public <FUCK>FUCK Disp1(FUCK t){
FUCK bT=null;
bT=t;
System.out.println("this is Disp1(): "+bT);
return bT;
}

public static void Disp2(int temp){
System.out.println("this is Disp2(): "+temp);
}

}

class Gclass1<T>{
Gclass1(T t){this.aT=t;}
public void Display(){
System.out.println("Gclass1 disp: "+this.aT);
}
private T aT=null;
}

class Gclass2{
Gclass2(Object t){this.aT=t;}
public void Display(){
System.out.println("Gclass2 disp: "+this.aT);
}
private Object aT=null;
}

class Gclass3<T extends Gclass4>{
Gclass3(T t){this.aT=t;}
public void Display(){
System.out.println("GGclass3 disp(): "+this.aT.getClass());
this.aT.Display();
}
private T aT=null;
}

class Gclass4<T>{
Gclass4(T t){this.aT=t;}
public void Display(){
System.out.println("GGclass4 disp(): "+this.aT);
}
public T aT=null;
}

class EGclass4 <T> extends Gclass4<T>{
EGclass4(T t){
super(t);
}
public void Display(){
System.out.println("EGclass4 disp(): "+super.aT);
}
}

/////////////////////////////////////////////////

输出结果

this is Disp1(): 123.456
this is Disp2(): 345
Gclass1 disp: abfsf
Gclass1 disp: 12345
Gclass2 disp: what a fuck object
Gclass2 disp: 123.456
GGclass3 disp(): class Gclass4
GGclass4 disp(): this is Gclass4
GGclass3 disp(): class EGclass4
EGclass4 disp(): this is EGclass4

//////////////////////////////////////////////////////////////////////////////////////////

首先是一个公共类Test1,静态函数main通过对象aTest1调用了一个非静态静态泛型函数Disp1(如果不通过对象,直接调用非静态不合法)

然后直接调用了静态函数Disp2;

创建了泛型类Gclass1,Gclass2。其中Gclass2通过Object创建,与Gclass1效果一样。

创建了泛型类Gclass4,她的子类泛型类EGclass4

创建了泛型类Gclass3,通过<T extends Gclass4>限制参数类型为Gclass4或其子类。

因为做了限定,所以采用Gclass3声明变量时只能用Gclass4或其子类

Gclass3<Gclass4> aGclass3=new Gclass3<Gclass4>(aGclass4);

Gclass3<EGclass4> aGclass3=new Gclass3<EGclass4>(aEGclass4);

 

java中的泛型

标签:

原文地址:http://www.cnblogs.com/wudymand/p/4275084.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!