Java学习笔记(九)
泛型(Generic)
类型安全,Java泛型只在编译阶段有效:在编译过程中,正确检查泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。
泛型类
class A<T>{
private T key;
public void setKey(T key) {
this.key=key;
}
public T getKey() {
return this.key;
}
}
A<string> a=new A<String>();
A a=new A(); //不指定泛型相当于指定了Object类型
泛型方法
class C<E>{
private E e;
public static <T> void test3(T t){
//静态方法中不能使用类定义泛型,只能使用静态方法自己定义的泛型
System.out.println(t);
}
public <T> void test(T s){
//在类中定义的泛型也可以在普通方法中使用
System.out.println(this.e);
T t=s;
}
public <T> T test1(T s){
return s;
}
public <T> void test2(T... strs){
for(T s:strs){
System.out.println(s);
}
}
}
public class Test1{
public static void main(String[] args){
C<Object> c=new C<Object>();
//泛型方法,在调用之前没有固定的数据类型
//在调用时,根据传入的参数类型将泛型改为此类型
c.test1(2);
c.test1(true);
}
}
泛型接口
interface IB<T>{
T test(T t);
}
//未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需要将泛型的声明一起加到类中
class B1<T> implements IB<T>{
@Override
public T test(T c){
return t;
}
}
//如果在实现接口时指定泛型的类型
class B2 implements IB<String>{
@Override
public String test(String t){
return t;
}
}
泛型通配符
class Dd{
//需要一个List集合,但不确定List集合到底存的是什么数据类型
public void test(List<?> list){
}
}
有限制的通配符
- <? extends class> class及其子类
- <? super class> class及其父类
- <? extends interface >接口及其实现类