Example:
package generictest;
public class Box<T,U> {
public <T,U> void inspect(T t, U u) {
System.out.println("T: "+t.getClass().getName());
System.out.println("U: "+u.getClass().getName());
}
}
---------------------------
package generictest;
public class Main {
public static void main(String[] args) {
Box<Integer, String> numBox = new Box<Integer, String>();
numBox.inspect(99,"3.14");
}
}
----------------------------
输出:
T: java.lang.Integer
U: java.lang.String
-----------------------------
<T>表示类型变量(Type Variable),相当于C++中的类模板(class template)。类型变量并不是真正的类,在java的类库里并没有T.class文件。事实上在编译期间会去除所有的generic信息,只留下ClassName.class在文件系统里。
generic类型可以有多个参数,但每个参数必须是它所声明的类或接口中独一无二的。例如ClassName<T,T>是错误的,ClassName<T,U>则是允许的。
类型参数的命名惯例:类型参数通常是单个大写的字母,常用的有:
* E - Element (广泛应用于Java Collections Framework)
* K - Key
* N - Number
* T - Type
* V - Value
* S,U,V etc. - 2nd, 3rd, 4th types
package generictest;
public class Box<T,U> {
public <T,U> void inspect(T t, U u) {
System.out.println("T: "+t.getClass().getName());
System.out.println("U: "+u.getClass().getName());
}
}
---------------------------
package generictest;
public class Main {
public static void main(String[] args) {
Box<Integer, String> numBox = new Box<Integer, String>();
numBox.inspect(99,"3.14");
}
}
----------------------------
输出:
T: java.lang.Integer
U: java.lang.String
-----------------------------
<T>表示类型变量(Type Variable),相当于C++中的类模板(class template)。类型变量并不是真正的类,在java的类库里并没有T.class文件。事实上在编译期间会去除所有的generic信息,只留下ClassName.class在文件系统里。
generic类型可以有多个参数,但每个参数必须是它所声明的类或接口中独一无二的。例如ClassName<T,T>是错误的,ClassName<T,U>则是允许的。
类型参数的命名惯例:类型参数通常是单个大写的字母,常用的有:
* E - Element (广泛应用于Java Collections Framework)
* K - Key
* N - Number
* T - Type
* V - Value
* S,U,V etc. - 2nd, 3rd, 4th types