java泛型学习示例
本文导语: Java泛型(Generics)是JDK5开始引入的一个新特性,允许在定义类和接口的时候使用类型参数(Type Parameter)。声明的类型参数在使用时用具体的类型来替换,现在泛型最主要的应用是在JDK5中的新集合类框架中,Map, List均有用到。其中...
Java泛型(Generics)是JDK5开始引入的一个新特性,允许在定义类和接口的时候使用类型参数(Type Parameter)。声明的类型参数在使用时用具体的类型来替换,现在泛型最主要的应用是在JDK5中的新集合类框架中,Map, List均有用到。其中的优点不言而喻,我们可以横向扩展更多的类,缺点呢,其实也就是他的优点,因为这需要我们在使用泛型类的时候,要很清楚自己的代码目地,不能使用错误的类型。
最基本的泛型类
package com.garinzhang.javabase.generic.e1;
/**
* 最基本的泛型类,类型由自己定义
* @author Garin Zhang
*
* @param
*/
public class Point {
private T var;
public T getVar() {
return var;
}
public void setVar(T var) {
this.var = var;
}
}
package com.garinzhang.javabase.generic.e1;
public class GenericExample {
/**
* @param args
*/
public static void main(String[] args) {
Point p = new Point ();
p.setVar("coder");
System.out.println(p.getVar());
}
}
多个泛型类型
package com.garinzhang.javabase.generic.e2;
/**
* 多个泛型类型,一般多个最好是以靠近T的字母,如S,R等
* @author Garin Zhang
*
* @param
* @param
*/
public class Notepad {
private T key;
private S value;
public T getKey() {
return this.key;
}
public S getValue() {
return this.value;
}
public void setKey(T key) {
this.key = key;
}
public void setValue(S value) {
this.value = value;
}
}
package com.garinzhang.javabase.generic.e2;
public class GenericExample {
/**
* @param args
*/
public static void main(String[] args) {
Notepad p = new Notepad ();
p.setKey("coder");
p.setValue(99999);
System.out.println("key: " + p.getKey());
System.out.println("value: " + p.getValue());
}
}
在方法参数中使用通配符"?"
package com.garinzhang.javabase.generic.e3;
/**
* 该例子关键在main方法里
* @author Garin Zhang
*
* @param
*/
public class Info {
private T key;
public T getKey() {
return this.key;
}
public void setKey(T key) {
this.key = key;
}
@Override
public String toString() {
return this.key.toString();
}
}
package com.garinzhang.javabase.generic.e3;
/**
* 在方法参数中使用通配符
* @author Garin Zhang
*
*/
public class GenericExample {
/**
* @param args
*/
public static void main(String[] args) {
Info i = new Info();
i.setKey("coder");
fun(i);
Info j = new Info();
j.setKey(9999);
fun(j);
}
public static void fun(Info temp) {
System.out.println("Content: " + temp);
}
}
向上转型失败
package com.garinzhang.javabase.generic.e4;
/**
* 该例子关键在main方法里
* @author Garin Zhang
*
* @param
*/
public class Info {
private T key;
public T getKey() {
return this.key;
}
public void setKey(T key) {
this.key = key;
}
@Override
public String toString() {
return this.key.toString();
}
}
package com.garinzhang.javabase.generic.e4;
public class GenericExample {
/**
* @param args
*/
public static void main(String[] args) {
Info strEg = new Info();
Info objEg;
// 编译错误"Type mismatch: cannot convert from Info to Info"
// 向上转型失败,String -> Object
// objEg = strEg;
}
}
泛型在接口中的使用
package com.garinzhang.javabase.generic.e5;
/**
* 该例子关键在main方法里
* @author Garin Zhang
*
* @param
*/
interface Info {
public T getVar();
}
package com.garinzhang.javabase.generic.e5;
/**
* 泛型类
* @author Garin Zhang
*
* @param
*/
public class InfoImpl implements Info {
private T var;
public InfoImpl(T var) {
this.setVar(var);
}
public void setVar(T var) {
this.var = var;
}
public T getVar() {
return this.var;
}
}
package com.garinzhang.javabase.generic.e5;
/**
* 非泛型类
* @author Garin Zhang
*
* @param
*/
public class InfoImpl1 implements Info {
private String var;
public InfoImpl1(String var) {
this.setVar(var);
}
public void setVar(String var) {
this.var = var;
}
public String getVar() {
return this.var;
}
}
package com.garinzhang.javabase.generic.e5;
public class GenericExample {
/**
* @param args
*/
public static void main(String[] args) {
Info strEg = new InfoImpl("coder");
System.out.println("Content: " + strEg.getVar());
Info strEg1 = new InfoImpl1("coder1");
System.out.println("Content: " + strEg1.getVar());
}
}
通配符和extends, super的使用
package com.garinzhang.javabase.generic.e6;
/**
* 该例子关键在main方法里
* @author Garin Zhang
*
* @param
*/
public class Info {
private T key;
public T getKey() {
return this.key;
}
public void setKey(T key) {
this.key = key;
}
@Override
public String toString() {
return this.key.toString();
}
}
package com.garinzhang.javabase.generic.e6;
public class GenericExample {
/**
* @param args
*/
public static void main(String[] args) {
Info strEg = new Info();
strEg.setKey("coder");
// 编译报错"The method fun(Info