zoukankan      html  css  js  c++  java
  • 18泛型

    JDK1.5才出现的。

    所谓泛型:就是允许在定义类、接口时指定类型形参,这个类型形参将在声明变量

    创建对象时确定(即传入实际的类型参数,也可称为类型实参) 

    包含泛型声明的类型可以在定义变量,创建对象时传入一个类型实参,从而可以动态的

    生成无数多个逻辑上的子类,但这种子类在物理上并不存在

    这里有一个值得注意的是当你创建带泛型声明的自定义类,为该类定义构造器时,构造器名

    还是与与原来的类名,不要增加泛型声明。例如为Apple<T>类定义构造器,其构造器名依然

    是Apple,而不是Apple<T>,但调用该构造器时却可以使用Apple<T>的形式,当然应该为T形参传入实际的类型参数。

    畸形写法:

    1. List<String> list=new ArrayList();

    2. List list=new ArrayList<String>();

    JDK1.7开始支持 List<String> list=new ArrayList(); 这么写,可以从前往后推到出后面具体的类型

    泛型的擦除:泛型类型由可以支持任意数据类型到具体的类型,发生在java的编译时期

    public class fanxing {
        public static void main(String[] args) {
            TDemo<String> t=new TDemo<String>();
            t.t="徐旺骑";
        }
    
    
    }
    //自定义泛型类
    //类名<标识符>
    //虽然可以随便写,但是我们通常用大写字母
    /*
     * E ----elements元素
     * T---- Type类型
     * R----Result结果
     * K-----键
     * V-----值
     * 
     */
    class TDemo<E>{
        //属性
        E t; //属性类型可以是任意的引用类型
        //E t1=new E();这是错误的给定的引用类型可能不能创建对象例如:接口类型
     //泛型方法
        public <E>void name(E i) { //泛型做参数类型
            
        }

     2.从泛型类派生子类

    当创建了带泛型声明的接口、父类之后,可以为该接口创建实现类,或从该父类来派生子类,但值得提出的时,当使用这些接口、父类时不能再包含类型形参,例如下面代码时错误的:

    public class Fanxing extends Apple<T> { //这个是错的不能用类型形参
    
        public static void main(String[] args) {
        
    
        }
    
    }
    class Apple<T>{
        
    }
    class A extends Apple<String>{ //用类型实参这个是对的
        
    }

    3.ArrayList<String>类当成ArrayList的子类,事实上ArrayList<String>类也确实是一种特殊的

    ArrayList类,这个ArrayList<String>对象只能添加String对象作为集合元素,但实际上系统并没有为

    ArrayList<String>生成新的class文件,而且也不会把ArrayList<String>当成新类来处理

    需要一个泛型参数既可以接收Double类型,又可以接收Integer类型,照理来讲我们可以找到这两个类的父类Number,做向上转型。但是泛型没有向上转型,这就比较的尴尬。所以为了满足我们的需求就有了

    重点

    类型通配符?:

    ?:被称之为统配符,他的元素类型可以匹配任何类型

    泛型的上限和泛型的下限。

    public static void main(String[] args) {
            //集合对象
            List<Integer> list1=new ArrayList<>();
            //
            list1.add(113);
            list1.add(3);
            list1.add(1);
            list1.add(1);
            list1.add(11);
            //集合对象
            List<Double> list2=new ArrayList<>();
            //
            list2.add(1.2);
            list2.add(3.0);
            list2.add(6.3);
            list2.add(1.2);
            list2.add(1.1);
            
            //List<Number> list=new ArrayList<Integer>();
            //泛型没有向上造型
            m(list1);
            m(list2);
            //m(new ArrayList<String>());//不是数字类型
        }
        
        //只遍历数字类型的集合
        //数字包装类的统一父类是Number
        //<? extends 类/接口>---可以传入的类型包括本类/本接口或者子类以及子接口
        //<? extends Number>---可以传入Number类型或者以及Number的子类
        //泛型的上限
        public static void m(List<? extends Number> list){//所有元素的数据类型都可以接收
            for (Object object : list) {
                System.out.println(object);
            }
        }
        
        //泛型下限
        //传入的类型最小类型是String
        //<? super 类/接口>---可以传入的类型要么是本类/本接口或者是父类以及父接口
        public void n(List<? super String> list){
            
        }

    4.泛型方法 :相当于是来约束方法的参数用的

  • 相关阅读:
    随笔2
    随笔
    关于updateElement接口
    随笔1
    本地访问正常,服务器访问乱码 记录
    Redis (error) NOAUTH Authentication required.解决方法
    tomcat启动很慢 停留在 At least one JAR was scanned for TLDs yet contained no TLDs.
    微信公众号消息回复
    微信公众号 报token验证失败
    idea中web.xml报错 Servlet should have a mapping
  • 原文地址:https://www.cnblogs.com/xuwangqi/p/11221851.html
Copyright © 2011-2022 走看看