泛型
什么是泛型
类型参数化
- 在类后面,用<>括起来
- 泛型名称随意,一般用大写的一个字母表示
- 可以定义多个泛型,多个泛型之间用,隔开
public class Box<E> {
private Object [] elementData;
private int size;
public Box(){
elementData = new Object[100];
}
public void add(E e){
elementData[size++] = e ;
}
public void show(){
for (Object object : elementData) {
if(object != null){
System.out.println(object);
}
}
}
}
Box<String> b = new Box<String>();
b.add("a");
b.add("b");
b.show();
Box<Integer> b1 = new Box<Integer>();
b1.add(1);
b1.add(2);
b1.show();
泛型的分类
- 泛型类
- 泛型方法
- 泛型接口
泛型类
泛型定义在类上
- 泛型是编译期间,编译之后,泛型会被擦除
- 静态的方法不能使用类上的泛型
public static void main(String[] args) {
// 泛型是编译期间,编译之后,泛型会被擦除
Box<Integer> b = new Box<Integer>();
b.add(1);
Box<String> b1 = new Box<String>();
b1.add("1");
// 添加一个数字1 ,反射
// 通配符
// method2(b);
// method2(b1);
}
// ?表示任意类型
public static void method(Box<?> box){
box.show();
}
// extends 定义泛型的上限
public static void method1(Box<? extends Integer > box){
box.show();
}
public static void method2(Box<? super String > box){
box.show();
}
泛型方法
泛型方法:泛型的定义在方法上
// 泛型方法:泛型的定义在方法上。泛型方法必须先声明跟定义
public static <T> void method(T t){
System.out.println(t);
}
// 返回类型是泛型T,它由调用接收的类型来确定
// 静态的方法不能使用类上的泛型
public static <T> T method2(){
return (T) "123";
}
泛型接口
-
直接确定接口泛型的类型
-
不确定,继续定义泛型类
public interface DemoInterface<E> { public void method(E e); }
/* * 实现泛型接口: * 1,直接确定接口泛型的类型 * 2,不确定,继续定义泛型类 */ public class Hello<E> implements DemoInterface<E>{ @Override public void method(E e) { System.out.println("----method----"); } }