zoukankan      html  css  js  c++  java
  • 泛型

    一、介绍

    泛型:参数化类型,使用广泛的类型。泛型是Java SE 1.5的新特性

    使用场景:数据类型不确定

    例如:现在要存储一个学生的成绩,但是成绩有可能想存为数字,小数,或者字符串(优秀,良好,好)之类的数据。这种数据都是类型不确定的。
    可以使用Object来存储该成绩,但是这样存储的话会把所有类型都当做Object来对待。从而”丢失”了实际的数据类型。获取数据的时候也需要转换类型,效率低,还容易出错。

    泛型的作用:

    安全:在程序编译的时候就已经自动帮你检查类型了,比较安全。
    省心:所有的类型转换都是自动和隐式的,提高代码的重用率。

    泛型的定义格式:<字母>

    字母可以是任意字母,但是大家都约定了常见字母的定义

    字母 表示的类型
    T Type表示类型
    K V 分别表示键值
    E 表示Element
    ? 表示不确定的类型

    1、泛型类:不能使用在静态属性,静态方法上

    1. class 类名<字母列表>{
    2. 修饰符 字母 属性;
    3. 修饰符 构造器(字母){
    4. }
    5. 修饰符 返回类型 方法(字母){
    6. }
    7. }

    例如:下面的Student类

    1. public class Student<T1, T2> {
    2. // 泛型不能使用在静态属性或者静态方法上:
    3. // 因为静态属性和方法是从属于类,在编译的时候就确定了类型。所有不能用在静态属性和方法上
    4. private T1 javaScope;// java成绩
    5. private T2 oracleScope;// oracle成绩
    6. public T1 getJavaScope() {
    7. return javaScope;
    8. }
    9. public void setJavaScope(T1 javaScope) {
    10. this.javaScope = javaScope;
    11. }
    12. public T2 getOracleScope() {
    13. return oracleScope;
    14. }
    15. public void setOracleScope(T2 oracleScope) {
    16. this.oracleScope = oracleScope;
    17. }
    18. public Student(T1 javaScope, T2 oracleScope) {
    19. super();
    20. this.javaScope = javaScope;
    21. this.oracleScope = oracleScope;
    22. }
    23. public Student() {
    24. }
    25. }

    等使用这个类的时候需要指定具体的类型

    1. //这里的String和Integer只能是引用类型,不能是基本类型
    2. Student<String,Integer> st = new Student<String,Integer>();
    3. st.setJavaScope("优秀");//这里就自动变为只能是字符类型的参数了
    4. Integer o = st.getOracleScope();//返回类型是Integer
    5. int o1 = st.getOracleScope();//既然返回类型是Integer,同样可以自动拆箱。使用int接收

    2、泛型接口:接口中泛型字母只能使用在方法中,不能使用在全局常量上

    1. public interface Comperator<T> {
    2. //T int A =2;//false:泛型不能使用在全局常量A上
    3. void compare(T t);//true:使用在方法上
    4. }

    3、泛型方法:修饰符 < T > 返回类型 方法名(){}

    泛型方法可以定义在普通类中,也可以定义在泛型类中

    1. public class User {
    2. //泛型方法:修饰符 <T> 返回类型 方法名(){}
    3. public static <T> void test(T a){
    4. System.out.println(a);
    5. }
    6. public static void main(String[] args) {
    7. test("String");
    8. }
    9. }

    4、泛型的范围:extends 表示<=

    1. //关闭流 extends:表示<=Closeable 也就是只能是Closeable接口的实现类
    2. public static <T extends Closeable> void closeIO(T...io){
    3. for (T temp : io) {
    4. if (temp!=null) {
    5. try {
    6. temp.close();
    7. } catch (IOException e) {
    8. e.printStackTrace();
    9. }
    10. }
    11. }
    12. }

    二、总结

    1. 类型安全: 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
    2. 消除强制类型转换: 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。避免了java.lang.ClassCastException异常
    3. 潜在的性能收益: 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。
    4. 安全简单:泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
    5. 泛型的类型参数只能是类类型(包括自定义类),不能是基本类型
    6. 在jdk1.7之后,构造函数中可以省略泛型类型。例如:




  • 相关阅读:
    任务五:基础JavaScript练习(二)
    任务四:基础JavaScript练习(一)
    JS判断一个对象为空对象
    任务三:零基础JavaScript编码(三)
    任务二:零基础JavaScript编码(二)
    任务一:零基础JavaScript编码(一)
    Jquery点击按钮 异步和同步提交表单
    2019 Google 开发者大会直播完整版
    Android 10 开发亮点有哪些?
    2019Android多线程面试总结
  • 原文地址:https://www.cnblogs.com/meet/p/5871122.html
Copyright © 2011-2022 走看看