zoukankan      html  css  js  c++  java
  • 泛型

    定义:

      类型由原来的具体的类型变为未知的类型,约束类型的定义的类编写时确定变为声明类的时候确定.

    理解:

      统一数据类型却不固定数据类型,只作用在代码编译阶段.

    产生原因:

      控制传入数据类型的一致性,但又不固定传入的类型

    泛型的可用位置:

    1,泛型接口 2,泛型类 3,泛型方法

    案例:

    package fx;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class GenericTest {
        public static void main(String[] args) {
            List list = new ArrayList();
            list.add("qq");
            list.add("weixin");
            list.add(100);
            for(int i=0;i<list.size();i++){
                String name = (String)list.get(i);//第三次转型报错java.lang.ClassCastException
                System.out.println("name:"+name);
            }
        }
    }

    由上例子中可以看出,没有泛型的不安全,容易造成这样的疏忽.加上泛型以后,编译检查期间就会做类型检查,避免了上述错误.

    list.add(100);//编译检查报错

    泛型注意事项:

    1,没有泛型数组

    2,声明时泛型的传入类型不同(List<??>),但生成的对象的类型是相同的(List).

    3,声明的对象的泛型不同,要传入统一的接口时,接口定义传入参数需要使用泛型通配符.

    例如:

    package fx;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class GenericTest2 {
        public static void getData(List<?> list){//不固定泛型的参数
            System.out.println("Data:"+list.getClass());//输出结果不管是什么泛型,都是相同的类型:Data:class java.util.ArrayList
        }
        public static void getDataStr(List<String> list){//固定泛型的参数
            System.out.println("Data:"+list.getClass());
        }
        public static void main(String[] args) {
            List<String> name = new ArrayList<String>();
            List<Integer> age = new ArrayList<Integer>();
            GenericTest2.getDataStr(name);//正常
            GenericTest2.getDataStr(age);//编译检查报错
            GenericTest2.getData(name);//正常
            GenericTest2.getData(age);//正常
        }
    }

    关于通配符:

    上限: List<? extends Number> 表示Number以及子类

    下限: List<? super Number> 表示Number以及父类

    ?: List<?> 表示任意 

  • 相关阅读:
    【Nginx】url 带有 “https://” 双斜杠特殊处理
    【layui】tepmlet 格式化 table 数据
    于二零二零年:终章
    【Golang】练习-Web 处理 form 表单请求失败不刷新页面并保存输入的数据
    实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)
    面向对象的进阶(item系列,__new__,__hash__,__eq__)
    面向对象阶段复习
    计算器实例
    反射
    静态方法staticmethod和类方法classmethod
  • 原文地址:https://www.cnblogs.com/qinggege/p/5213229.html
Copyright © 2011-2022 走看看