zoukankan      html  css  js  c++  java
  • 泛型 -Java

    泛型

    一、集合中的泛型

    不使用泛型带来的问题:

    ArrayList 默认接受Object类型的对象,所以所有对象都可以放进ArrayList中;
    接着,需要进行强制转换才可以得到English类型或者Math类型;
    如果程序员记忆比较好,能记得哪个是哪个,还是可以的;
    但是,比如第10行,把第1个对象转换为English,这样就会出现类型转换异常 。

    public class TestGeneric {
    	public static void main(String[] args) {
    		
    		List schoolWork = new ArrayList();
    		
    		schoolWork.add(new English());
    		schoolWork.add(new Math());
    		
    		English eng = (English) schoolWork.get(0);
    		English eng1 = (English) schoolWork.get(1);  //1对应Math,会出现异常
    	}
    }
    

    使用泛型

    泛型的用法是在容器后面添加
    Type可以是类,抽象类,接口。

    public class TestGeneric {
    	public static void main(String[] args) {
    		
    		List<English> schoolWork = new ArrayList<>();
    		
    		schoolWork.add(new English());
    		// schoolWork.add(new Math());	其他类型放不进去
    	}
    }
    

    子类对象

    如上代码,如果Math是English的子类,那么English泛型的容器是可以放进去Math类对象的。

    二、通配符

    ?extends

    //假设Math和English是Chinese的子类
    List<?extends Chinese> schoolWork = new ArrayList<>();//表示这是一个Chinese泛型或其子类泛型
    //schoolWork 的泛型有可能是Chinese、Math或者是English
    //也就是说取出来一定可以转成Chinese类,但却不可以放进去对象
    

    ?super

    //假设Math和English是Chinese的子类,Chinese是Object的子类
    List<?super Chinese> schoolWork = new ArrayList<>();  //表示这是一个Chinese泛型或其父类泛型
    //schoolWork 的泛型可能是Chinese或者是其父类Object
    //也就是说可以放进去Chinese类对象或者Math和English类对象,但却无法取出,因为Object强转Chinese是会失败的
    

    ?

    List<?> schoolWork = new ArrayList<>();  //表示这是一个任意类泛型
    //也就是说只能以继承树顶类型取出对象,却无法放进去对象
    

    总结

    如果希望只取出,不插入,就使用? extends
    如果希望只插入,不取出,就使用? super
    如果希望,又能插入,又能取出,就不要用通配符?

    相关ArrayList知识请点击这里

  • 相关阅读:
    windows I/O系统
    MYSQL复习笔记7-索引
    LOG收集系统(一):原日志至收集
    MYSQL复习笔记6-字符集
    MYSQL复习笔记5-select-from-where子句
    MYSQL复习笔记4-基本SQL语句
    MYSQL复习笔记3-用户和安全
    MYSQL复习笔记2-自带工具介绍
    MYSQL复习笔记1-物理文件和系统架构
    Mysql复习
  • 原文地址:https://www.cnblogs.com/zx224569/p/12972389.html
Copyright © 2011-2022 走看看