Java泛型

来源:互联网 发布:2017最新人工智能产品 编辑:程序博客网 时间:2024/06/03 09:21

1、泛型

Java泛型是JDK1.5之后出现的,可以在编译时期进行类型检查。
注意:泛型只在编译时期有效,编译后的字节码文件中不存在有泛型信息!

测试:

/* * 泛型擦除实例     public void save(List<Person> p){    }    public void save(List<Dept> d){    // 报错: 与上面方法编译后一样,说明编译后字节码不存在泛型    }    */

泛型方法

public <K,T> T save(T t,K k) {        return null;    }

泛型类

// 泛型类(在new这个类时传入类型)public class GenericDemo<T> {    // 定义泛型方法    public <K> T save(T t,K k) {        return null;    }    public void update(T t) {    }}

泛型接口

// 泛型接口,在实现这个接口的类中指定类型public interface IBaseDao<T> {    void save(T t );    void update(T t );}
public class BaseDao<T> implements IBaseDao<T> {    ...}
public class PersonDao implements IBaseDao<Person>{    ...}

泛型关键字

泛型中? extends super

?的作用是:不知道接收的泛型类型,为了不失去泛型特性用来占位,这样接收的参数只可以访问,不可以修改

@Testpublic void test1(){    // ?可以接收任何泛型集合,但是不能编辑集合值,所以一般在方法参数中使用    List<?> list = new ArrayList<String>();//      list.add("");//报错}

? extends Type
泛型类型继承自一个类型,必须传入Type的子类

public void save(List<? extends Number> list){}@Testpublic void test2(){    List<Integer> list1 = new ArrayList<>();    List<Float> list2 = new ArrayList<>();    List<String> list3 = new ArrayList<>();    // Integer和Float都继承自Number所以可以,String没有继承所以不行    save(list1);    save(list2);//  save(list3);//报错}

? super Type
super关键字和extends类似,必须传入Type的父类