泛型
Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法,也就是说,
泛型信息不会进入到运行时阶段
泛型的使用
泛型类
不指定泛型相当于指定了一个Object类
同一个类,但是在new对象时泛型指定的不同数据类型,这些对象不能相互赋值
List list = new ArrayList();
list.add(111);
list.add("aa");
list.add(true);
//需求,只能在集合中存字符串
List<String> l=new ArrayList<String>();
l.add("abc");
// l.add(true); 这个是在编译期发现的问题
A<String> a1=new A<String>(); //在new A的对象的时候指定泛型的类型为String
a1.setKey("str"); //对象使用setKey(T key)时候,中的key形参就是String
System.out.println(a1.getKey());//返回值就有new对象确定返回值是String
A<Integer> a2=new A<Integer>();
a2.setKey(123);
System.out.println(a2.getKey());
A a3=new A(); //不指定泛型相当于指定了一个Object类型
// A<Object> a3=new A<Object>();
a3.setKey(new Object());
Object obj=a3.getKey();
泛型接口
public class Test1 {
public static void main(String[] args) {
B1<String> b1=new B1<String>();
B1<Object> b2=new B1<Object>();
B2 b3=new B2();//不用指定泛型
}
}
interface IB<T>{
T test(T t);
}
/**
* 未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需要将泛型的声明也一起加到类中
* @author zym
*
* @param <T>
*/
class B1<T> implements IB<T>{
@Override
public T test(T t) {
return t;
}
}
/**
* 如果实现接口时指定接口的泛型的具体数据类型
* 这个类实现接口所有方法的位置都要泛型替换实际的具体数据类型
* @author zym
*
*/
class B2 implements IB<String>{
@Override
public String test(String t) {
return null;
}
}
3.泛型方法