Java泛型
在没有泛型的时候,集合中可以放入任意对象:
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List list = new ArrayList();
list.add("xxx");
list.add(123);
}
}
在取出时,必须进行类型强转:
String s = (String) list.get(0);
int i = (int) list.get(1);
有了泛型之后,取出时不用进行强转:
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("xxx");
String s = list.get(0);
}
}
泛型只在编译期有效:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String []args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
List<Integer> list = new ArrayList<>();
list.add(111);
list.add(222);
Class c = list.getClass();
Method m = c.getMethod("add", Object.class);
m.invoke(list,"Hello");
System.out.println(list);
}
}
- 一个List集合插入两个Integer类型
- 运行时通过反射再插入一个String类型
- 没有报错,说明在运行时泛型不再起作用
泛型使用方法:
- 泛型类和接口
- 泛型方法
泛型类:
public class Test {
public static void main(String[] args) {
Test2<String> test2 = new Test2<>();
test2.field = "xxx";
System.out.println(test2.field);
}
}
class Test2<T> {
T field;
}
泛型方法:
public class Test {
public static void main(String[] args) {
System.out.println(method("xxx"));
}
static <T> T method(T var) {
return var;
}
}
使用泛型限定子类型:
public class Test {
public static void main(String[] args) {
method(new Test2());
method(new Test3()); // 非Test的子类型,会报错
}
static <T extends Test> T method(T var) {
return var;
}
}
class Test2 extends Test {
}
class Test3 {
}