1. 泛型方法 的定义
<T> void method() or <T> List<T> method()
<T> 表示声明泛型方法,是语法的一部分,“List<T>”或"void"表示方法的返回类型。
如果在泛型类中定义泛型方法则不需要刻意声明该方法为泛型方法,即需要将第一个<T>去掉。例:
public interface IClass {
public <T> T view(T str);
}
IClass接口中只有一个view()方法,实现查看的功能。先定义一个ClassTwo实现IClass接口中的泛型方法view()。
public class ClassTwo implements IClass{
public <T> T view(T str) {
System.out.println(str);
return str;
}
}
2. 泛型类的定义
public class className<T extends InterOrClass, U>
定义了一个泛型类,该类包含了两个参数T和U,其中T是继承/实现了类/接口 InterOrClass, 如果实现了多个接口则用&连接。例:
public class ClassOne <T extends IClass,U>{
private T a;
private U b;
public T getA() {
return a;
}
public void setA(T a) {
this.a = a;
}
public U getB() {
return b;
}
public void setB(U b) {
this.b = b;
}
} public static void getList(){
List<String> list = new ArrayList<String>();
list.add(new String("1111"));
String str = list.get(0);
System.out.println(str);
}
通过<>内指定的类型参数,我们就可以很直观的知道List的类型,不需要强制的进行转换,避免了异常,编绎器也直接利用这个类型参数信息,能直接按类型参数处理,而且不是按Obejct来处理,相对更安全,同时编绎器会检查输入的类型是不是<>是指定的参数类型,如是要不是刚编绎无法通过,这当然要比在运行时异常要好啦。
泛型类的定义
要定义一个泛型类,其实也不是很难,下面我们定义一个有两个变量的泛型类。 [code]
java 代码
public class ClassOne <T extends IClass,U>{
private T a;
private U b;
public T getA() {
return a;
}
public void setA(T a) {
this.a = a;
}
public U getB() {
return b;
}
public void setB(U b) {
this.b = b;
}
}
这里的ClassOne类,定义了两个变量类型参数,分别为T、U,按照Java文档中的说法,使用泛型定义命名时,E为集合的元素类型,K和V表示关键字和值的类型,T表示任意类型。其中可以看到T 继承了IClass接口,在泛型的定义中如果类继承父类或实现接口都用关键字"extends"来表示,如果是多个父类或接口可以用“&”连接,这说明T这个类型参数的类型必然继承IClass或实现IClass接口. 当然,也可以将extends理解为对参数类型范围的一个限制,T extends Iclass可以理解为T的类型必须是<=Iclass,其实与将它理解为继承或者实现是一个意思。 除此之外,对参数T还可以有下限限制即写作:<? super T>,完整的写法是T extends Iclass<?super T>.
最后,我们来看一个将以上两个类实例化的例子:
再看具体的ClassOne的实例调用 ,下面实例化ClassOne的类
public static void main(String[] args) {
ClassTwo t = new ClassTwo();
ClassOne<ClassTwo,Integer> c = new ClassOne<ClassTwo,Integer>();
c.setA(t);
c.setB(new Integer(0));
c.getA().<String>view(new String(""));
}
以上说明了定义泛型类和泛型方法,有点像C++的模板,但是又不相同,当然我上面只是简单的介绍一些特性,更多信息需要参考JDK的文档。