声明一个泛型类
class People<E>
People是泛型类的名称
E为泛型,他可以是任意的对象或接口,但不能是基本类型,当用泛型类去创建一个对象,E要指定为引用类型。
方法泛型
Public<E> void Demo01(E e){}.....................非静态方法的泛型的类型最好与类中的泛型保持一致
Public static<W> void Demo01(W e){}...................静态方法的泛型的类型不能与类中的泛型保持一致,要声明自己的泛型<W>。因为,静态方法随着类的加载而加载,而静态在没有创建对象的时候它就赋值。例如(static int a; a默认输出为0),此时就会报错。
泛型接口
interface Inter<T>{
public void show(T t);
}
class Demo implements Inter<String>{ //在声明一个类实现接口的时候,不需要给自己的类添加一个泛型
@Override
public void show(String t) {
System.out.println(t);
}
}
泛型之通配符
/*A:泛型通配符:<?> * 当右边的泛型不确定时,左边可以指定为?号 * B:? extends E * 向下限定,E和子类 * c:? super E * 向上限定 E和父类 * */ List<?> list = new ArrayList<String>();// 当右边的泛型不确定时,左边可以指定为?号
类型安全
1、泛型的主要目标是提高 Java 程序的类型安全
编译时期就可以检查出因 Java 类型不正确导致的 ClassCastException 异常
符合越早出错代价越小原则
2、消除强制类型转换
泛型的一个附带好处是,使用时直接得到目标类型,消除许多强制类型转换
所得即所需,这使得代码更加可读,并且减少了出错机会
3、潜在的性能收益
由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改
所有工作都在编译器中完成
编译器生成的代码跟不使用泛型(和强制类型转换)时所写的代码几乎一致,只是更能确保类型安全而已
详情:https://blog.csdn.net/u011240877/article/details/53545041
例如:
public class Demo01_E {
public static void main(String[] args){
/*java泛型
* 集合的泛型要保证前后数据一致
* */
ArrayList<Student> list = new ArrayList<Student>();// 集合的泛型要保证前后数据一致,泛型是引用类型、不能是基本类型
ArrayList<Object> list1 = new ArrayList<>();// 1.7版本的新特性,菱形泛型,后面的默认也前面类型。因为Object是超级父类,泛型定义为object无意义
list.add(new Student("张三",23));
list.add(new Student("李四",24));
Iterator<Student> it = list.iterator();//迭代的时候确定是Student对象
while(it.hasNext()){
Student student = it.next();/*如果不使用泛型,it.next()返回的是Object对象,
此时就不能调用到student对象的get和set方法,如果写了在编译的时候就会提示报错,必须向下转型
Student student = (Student)it.next();。然而当声明泛型后,迭代器已经确定好迭代的对象Student,此时就不用强转了。*/
System.out.println(student.getName()+"....."+student.getAge());
}
}
}