泛型
- 泛型只在编译阶段有效
- 目的是限制输入数据类型
- 如下,如果不指定List的类型,我们是可以将String Integer 或者其它类型的数据添加到list中的,如果误将int数据添加到ArrayList中,而在取出来用的时候,,我们以为全是String 在使用String强制装换的时候会报错。如果在List定义的时候就指定的泛型为String,那么如果我们添加的是Int就会报错。
List list = new ArrayList();
list.add("xixi");
list.add(12); // 不会报错
for (int i = 0; i < list.size(); i++) {
System.out.println((String) list.get(i)); // 会报错
}
泛型通常有三种,泛型方法,泛型类,泛型接口
泛型类
泛型类通常用来写一些不同类的共同方法,传入不同的对象,
// 简单的泛型 这里的T 只是一个符号,没有实际意义
public class GenericClass<T> {
private T t;
public GenericClass() {
}
public GenericClass(T t) {
this.t = t;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
泛型接口
泛型接口常用于类的生产器。产生各种类型的类
public interface GenericsInterface<T> {
public T test();
}
实现类中如果指定泛型的类型那么所有用到泛型的地方都需要指定为实参的类型
public class GenericsInterfaceImpl implements GenericsInterface<String> {
@Override
public String test() {
return null;
}
}
通配符 ? 表示所有的。当只用到Object的方法,,又不确定输入的是String还是Interger的时候可以用。
泛型方法
泛型方法主要用于输入参数的类型不确定的地方
标准格式:这里的T只是一个代号,你可以叫它X M 。。。。只是占个位置而已。
public T test(T t){return t}
泛型函数可以存在泛型类中,也可以独立存在,,,存在泛型类中的时候 和泛型类的泛型没有任何关系。如下
public class GenericClass<T> {
private T t;
public GenericClass() {
}
public GenericClass(T t) {
this.t = t;
}
// 这两个set get方法并不算泛型 泛型需要用 <T>指定
public T getT() {
System.out.println("我是泛型类的get方法");
return t;
}
public void setT(T t) {
this.t = t;
}
// 泛型方法
// 这个T 和本类的T 没有关系,是一个新的泛型
public <T> T test1(T t){
System.out.println("我是泛型内的泛型方法,我的T 和泛型类的T 没关系"+t.toString());
return t;
}
public <E> E test2(E e){
System.out.println("泛型T 的泛型类里面当然也可以定义泛型为E的泛型方法"+e.toString());
return e;
}
}
main测试
public class GenericsDemo {
public static void main(String[] args) {
// 泛型方法测试
String result = test("xixixi");
System.out.println(result);
System.out.println(test(3));
GenericClass<String> genericClass = new GenericClass<>("泛型类"); // 泛型指定为String
// GenericClass<String> genericClass2 = new GenericClass<>(2); // 错误示范,,输入参数类型和泛型不相符
genericClass.getT(); // 泛型类的方法 并不是泛型方法,只是一个泛型类的普通方法
genericClass.test1(3); // 泛型类的泛型T和泛型方法的泛型T没有关系。。
genericClass.test2("xixi"); // 泛型方法的泛型可以定义为任何类型 E ,T ,M ,S G,
}
// 定义泛型方法 泛型方法可以被定义到普通类中,泛型类中。
public static <X> X test(X t) {
System.out.println("泛型方法" + t.toString());
return t;
}
}
特别注意
泛型与静态方法
如果一个静态方法 使用泛型做参数,那么这个静态方法也必须定义成泛型方法。
比如
public static void(T t) // 这样是错误的
public <T> static void (T t) // 正确