zoukankan      html  css  js  c++  java
  • 泛型

    泛型
    为什么使用
    1)存储在任意类型的数据在集合中,但是取出来的都是Object类型的,此时就得强转

    List list=new ArrayList();
    list.add(1);//Integer
    Object object=list.get(0);
     //现在需要调用Integer中的方法
    Integer integer=(Integer) object;
     System.out.println(integer);

    2)约束存储到集合中的元素必须是相同的数据类型(相同的数据类型才能做比较,比如TreeSet类)

    TreeSet treeSet=new TreeSet();
    treeSet.add(123);
    treeSet.add("谭磊");
    System.out.println(treeSet);
    TreeSet会报异常   里面元素要做比较  类型不一样

    3)设计一个点(point)类,来封装坐标位置,要求坐标位置支持Integer,String,Double

    不优雅设计,代码重复

    1.泛型(GenericType):从java5开始支持的新的语法
    1):广泛通用的类型
    2):代码模板中类型不确定,谁调用该段代码,谁指明类型是什么

    自定义类型在类后加<T> 该类型具体是什么,由类的调用者来决定

    public class fanx<T> {
    private T x;
    private T y;
        public static void main(String[] args) {
            
        }
    fanx
    <T> xx=new fanx<T>()

    2.泛型类:直接在类/接口上定义的泛型
    使用泛型
    保证前后类型相同

    List<String> list=new ArraysList<String>();该List集合中只能存储String类型的元素

    因为前后类型相同 从java7推出了泛型的菱形语法<>.

    List<String> list=new ArraysList<>();

    3.泛型不存在继承的关系
    从此以后使用集合都得用泛型 约束该集合中的类型
    通过反编译底层通过强制没用泛型

    4.泛型方法:在方法上声明泛型

    1)泛型类中的泛型只能适用于非静态的方法,如果需要给静态方法设置泛型,此时需要使用泛型方法

    2)泛型类中的泛型应该适用于整个类中的多个方法,有时候只对一个方法设置泛型即可

    一般地,把自定义的泛型作为该方法的返回类型才有意义,而且此时的泛型必须是由参数设置进来的

    如果没有参数来设置泛型的具体类型,此时的方法一般返回设计为Object即可

    5.泛型的通配符:不知道使用什么来接收的时候,可以使用?,?表示通配符,任意的,只能用来接收

    public static void main(String[] args) {
            List<Integer> list=new ArrayList<>();
            dowork(list);
    }
    private  static  void dowork(List<?> list) {
            
    }

    6.泛型的上限和下限:用来限定元素的类型必须是X类子类或相同,X类的父类或相同

    //此时的泛型?,必须是Number类型或是Number类的子类,泛型的上限
    private  static  void dowork(List<? extends Number> list) {
            
    }
    //此时的泛型?,必须是Number类型或是Number类的父类,泛型的下限
    private  static  void dowork(List<? super Number> list) {
            
    }

    7.泛型的擦除和转换
    泛型的擦除:
    1)泛型编译之后就消失了(泛型自动擦除)
    2)当把带有泛型的集合赋给不带泛型的集合,此时泛型被擦除

    8.堆污染:当一个方法既使用泛型的时候也使用可变参数,此时容易导致堆污染问题
    如:Arrays类的asList方法
    注解的@SafeVarargs抑制问题的发生

  • 相关阅读:
    文件操作
    内置函数
    lambda表达式
    函数基础
    基础数据类型-dict
    基础数据类型-tuple
    基础数据类型-list
    基础数据类型-set
    Python开发【第三篇】基本数据类型
    Python开发【第二篇】运算符
  • 原文地址:https://www.cnblogs.com/tanlei-sxs/p/9515838.html
Copyright © 2011-2022 走看看