泛型

作者: 四喜汤圆 | 来源:发表于2018-04-19 09:29 被阅读3次

一、总体认识

泛型.png

二、重点说明

1.泛型擦除失去了代码的优雅性

import java.util.ArrayList;
import java.util.List;

public class 泛型擦除 {

    public static String print(List<String> l){
        System.out.println("");
        return "";
    }
    
    /**
     * 泛型擦除,导致这两个方法不能重载,因为泛型擦除后都成为了List<E>
     * @param l
     * @return
     */
    public static int print(List<Integer> l){
        System.out.println("");
        return 1;
        
    }
    
    public static void main(String[] args){
        // 在JDK1.6上通过修改两个方法的返回值可以达到上述两个方法重载的目的,
//      但JDK1.8上这样的处理方式编译器已经拒绝编译了
        print(new ArrayList<String>());
        print(new ArrayList<Integer>());
    }
    
}

2.类型通配符、带限通配符

public class 泛型通配符 {
    /**
     * ?为通配符,它的元素类型可以匹配任何类型
     * @param c
     */
    public void test(List<?> c) {
        for (int i = 0; i < c.size(); i++) {
            System.out.println(c.get(i));
        }
    }
    
    public static void main(String[] args) {
        List<?> l=new ArrayList<String>();
        /**
         * 程序无法确定集合l中元素的类型,所以不能向其中添加对象。
         * 故引入带限通配符:1,上限通配符;2,下限通配符
         */
//      l.add("");
        /**
         * 1,上限通配符:
         * 1)用extends:指定传入的类型必须是继承某个类;
         * 2)实现某个接口:指定传入的类型必须实现某个接口
         */
//      List<? extends Shape> l1=new ArrayList<Circle>();
        /**
         * 2,下限通配符
         * 1)用super:指定传入的类型必须是某个类的父类,或某个接口的父接口,
         * 也可以是这个类或接口本身
         */
//      List<? super Circle> l2=new ArrayList<Shape>();
    }
}

3.泛型擦除

不管传入哪一种类型实参,Java都把它们当做同一个类型进行处理。故Java泛型这一概念只作用于代码编译阶段,在编译过程中正确检验泛型结果后,会将泛型的相关信息擦除。泛型信息不会进入到运行时阶段

/**
 * 
* <p>Description: 
* 泛型擦除:无论泛型实参是什么,Java都把他们当成同一个类型进行处理。
* </p>  
* @author 杨丽金  
* @date 2018-4-19  
* @version 1.0
 */
public class 证明泛型擦除 {

    public static void main(String[] args) {
        // 定义两个集合类型的变量,分别传入不同的实参,判断他们的类型是否相同
        List<String> l1=new ArrayList<>();
        List<Integer> l2=new ArrayList<>();
        System.out.println(l1.getClass()==l2.getClass());// true
    }
}

参考文献

泛型_Ruheng校招指南

相关文章

  • 泛型 & 注解 & Log4J日志组件

    掌握的知识 : 基本用法、泛型擦除、泛型类/泛型方法/泛型接口、泛型关键字、反射泛型(案例) 泛型 概述 : 泛型...

  • 【泛型】通配符与嵌套

    上一篇 【泛型】泛型的作用与定义 1 泛型分类 泛型可以分成泛型类、泛型方法和泛型接口 1.1 泛型类 一个泛型类...

  • 泛型的使用

    泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法 泛型类 泛型接口 泛型通配符 泛型方法 静态方法与...

  • Java 泛型

    泛型类 例如 泛型接口 例如 泛型通配符 泛型方法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型上下边...

  • 探秘 Java 中的泛型(Generic)

    本文包括:JDK5之前集合对象使用问题泛型的出现泛型应用泛型典型应用自定义泛型——泛型方法自定义泛型——泛型类泛型...

  • Web笔记-基础加强

    泛型高级应用 自定义泛型方法 自定义泛型类 泛型通配符? 泛型的上下限 泛型的定义者和泛型的使用者 泛型的定义者:...

  • 重走安卓进阶路——泛型

    ps.原来的标题 为什么我们需要泛型? 泛型类、泛型接口和泛型方法(泛型类和泛型接口的定义与泛型方法辨析); 如何...

  • Kotlin泛型的高级特性(六)

    泛型的高级特性1、泛型实化2、泛型协变3、泛型逆变 泛型实化 在Java中(JDK1.5之后),泛型功能是通过泛型...

  • Java 19-5.1泛型

    泛型类定义泛型类可以规定传入对象 泛型类 和泛型方法 泛型接口 如果实现类也无法确定泛型 可以在继承类中确定泛型:

  • 【Swift】泛型常见使用

    1、Swift泛型4种 泛型函数泛型类型泛型协议泛型约束 2、泛型约束3种 继承约束:泛型类型 必须 是某个类的子...

网友评论

      本文标题:泛型

      本文链接:https://www.haomeiwen.com/subject/iipikftx.html