一、泛型(Generic)在集合中的使用

1.作用

(1)解决元素存储的安全问题

(2)解决获取数据元素时,需要类型强转的问题

2.代码案例

        //在集合没有使用泛型的情况下
List list = new ArrayList();
//list用来存放成绩
list.add();
list.add();
list.add();
//在没有使用泛型时,任何Object及其子类都可以添加进来,不安全
list.add(new String("AA")); for(int i = ; i < list.size();i++){
//在强转字符串“AA”为int型时报ClassCastException的异常
int score = (Integer)list.get(i);
System.out.println(score);
}
        //在集合中使用泛型
List<Integer> list = new ArrayList<Integer>();
//list用来存放成绩
list.add();
list.add();
list.add();
//list.add(new String("AA"));编译时就不通过,只能添加Integer类型的元素 Iterator<Integer> it = list.iterator();//用Iterator也需要声明泛型为Integer
while(it.hasNext()){
System.out.println(it.next());
}

二、自定义泛型类、泛型接口、泛型方法

1.特点

(1)当实例化泛型类的对象时,指明泛型的类型,对应的类中所有使用泛型的位置,都变为指定的类型

(2)如果泛型类在实例化时没有指明泛型的类型,默认为Object类

(3)通过对象调用泛型方法时,指明泛型的类型,这个类型可以和泛型类的泛型的类型不一致。

(4)静态方法中不能使用类的泛型(因为类的泛型在实例化才指明类型,所以不能在静态方法中使用)

(5)不能在try-catch中使用泛型

2.代码示例

//自定义泛型类
public class Order<T> {//实例化后,类中的所有T都变为指定的类型
private T t;
List<T> list = new ArrayList<>(); public void add(){
list.add(t);
}
public T getT(){
return t;
}
public void setT(T t){
this.t = t;
}
//声明一个泛型方法,实现任意类型的数组到集合的复制
public <E> List<E> fromArrayToList(E[] e,List<E> list){//注意“<E>”的位置,不能少
for(E e1 : e){
list.add(e1);
}
return list;
}
}
//继承泛型类或泛型接口时,可以指明泛型的类型,也可以不指明
class SubOrder extends Order<Integer>{//class SubOrder<T> extends Order<T>{} }
//泛型类的使用
public class TestGeneric{
public static void main(String[] args){
Order<Boolean> order = new Order<Boolean>();
order.setT(true);//参数只能是Boolean类型的
System.out.println(order.getT());//输出true
order.add();
List<Boolean> list = order.list;
System.out.println(list);//输出[true] SubOrder o1 = new SubOrder();
//只能用List<Integer>类型的List接收SubOrder类型的list。
List<Integer> list1 = o1.list; Integer[] i = new Integer[](,,);
List<Integer> list2 = new ArrayList<>();
List<Integer> list3 = order.fromArrayToList(i,list2);
System.out.println(list2);//输出[1,2,3]
System.out.println(list3);输出[,,]
}
}

三、泛型与继承的关系以及通配符

1.泛型与继承的关系:即使类A是类B的子类,List<A>也不是List<B>的子接口。

        Object obj = null;
String str = "AA";
obj = str;//String是Object的子类,这么写没错 Object[] obj1 = null;
String[] str1 = new String[]("AA","BB","CC");
obj1 = str1;//也没错 List<Object> list = null;
List<String> list1 = new ArrayList<String>();
list = list1;//报错,类型不匹配
//用反证法,假设list = list1正确
//list.add(123);list可以传入Object类型的元素
//String str = list.get(0);//报错,所以假设不正确

2.通配符—— ?

(1)特点

A:List<A>、List<B>. . . . . .都是List<?>的子类

B:? extends A:可以存放A及其子类

C:? super A:可以存放A及其父类

        List<?> list = null;
List<Object> list1 = new ArrayList<Object>();
List<String> list2 = new ArrayList<String>();
list = list1;//没错,LIst<?>是List<Object>的父类
list = list2;//没错,LIst<?>是List<String>的父类 List<? extends Number> list3 = null;
LIst<Integer> list4 = null;
list3 = list4;//没错
list3 = list1;//报错,只能是Number或Number的子类
List<? super Number> list5 = null;
list5 = list1;//没错

(2)通配符的使用

        List<String> list = new ArrayList<String>();
list.add("AA");
list.add("BB");
List<?> list1 = list;
//可以读取声明为通配符的集合类的对象
Iterator<?> iterator = list1.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());//把next()返回的值都看成是Object类型的,所以可以读取
}
//不允许向声明为通配符的集合类的对象写入对象,唯一例外的是null
list1.add("CC");//报错,不知道写入的是什么类型的对象
list1.add();//报错
list1.add(null);//正确

Java语法基础学习DayTwelve(泛型)的更多相关文章

  1. Java语法基础学习DayNineteen(反射机制)

    一.Refection定义 1.概述 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性 ...

  2. Java语法基础学习DayEighteen(常用类)

    一.String类 1.特点 String代表不可变的字符序列,底层用char[]存放. String是final的. 2.内存解析 3.常用方法 int length() char charAt(i ...

  3. Java语法基础学习DaySeven

    ---恢复内容开始--- 一.包装类——Wrapper 1.定义:针对八种基本数据类型定义相应的引用类型——包装类(封装类) boolean——Boolean          byte——Byte ...

  4. Java语法基础学习DaySix

    一.JavaBean——可重用组件 1.JavaBean是指符合以下标准的Java类: (1)类是公共的 (2)有一个无参的公共的构造器 (3)有属性,且有对应的get.set方法 2.好处 用户可以 ...

  5. Java语法基础学习DayThree

    一.流程控制语句补充 1.switch语句 格式: switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; break; ... default: 语句体 ...

  6. Java语法基础学习DayTwentyOne(网络编程)

    一.IP地址和端口号 1.作用 通过IP地址,唯一的定位互联网上一台主机. 端口号标识正在计算机上运行的进程,不同进程有不同的端口号,被规定为一个16位的整数0~65535,其中0~1023被预先定义 ...

  7. Java语法基础学习DayTwenty(反射机制续)

    一.Java动态代理 1.代理设计模式的原理 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象. 任何对原始对象的调用都要通过代理. 代理对象决定是否以及何时将方法调用转到原始对象上. 2. ...

  8. Java语法基础学习DaySeventeen(多线程续)

    一.线程的特点 1.线程的分类 java中的线程分为两类:守护线程和用户线程.唯一的区别是判断JVM何时离开. 守护线程是用来服务用户线程的,通过在start()方法前调用Thread.setDaem ...

  9. Java语法基础学习DaySixteen(多线程)

    一.多线程的创建 1.作用 程序需要同时执行两个或多个任务时需要多线程. 程序需要实现需要等待的任务时,如用户输入.文件读写操作.网络操作.搜索等,需要多线程. 需要一些后台运行的程序时,需要多线程. ...

随机推荐

  1. Lucky 7 (容斥原理 + 中国剩余定理)

    题意:求满足7的倍数,不满足其他条件num % p == a 的num的个数. 思路:利用中国剩余定理我i们可以求出7的倍数,但是多算了不满足约定条件又得减去一个,但是又发现多减了,又得加回来.如此, ...

  2. Spring Boot 的 application.properties

    更改默认端口:8080 server.port = 8081 更改context-path :/server.context-path = /springboot #server.address= # ...

  3. java 常用的异常处理

    在Java中异常被当做对象来处理,根类是java.lang.Throwable类,在Java中定义了很多异常类(如OutOfMemoryError.NullPointerException.Index ...

  4. zabbix自动发现自动注册

    一.自动发现 1. 2自动注册详细配置 二.自动注册 1. . 2.自动注册详细配置 三 自动安装zabbix客户端脚本 #!/bin/bash #robin path='/etc/zabbix/za ...

  5. Eclipse新建Java工程出现红色感叹号怎么解决?

    安装了新版本的JDK之后,在Eclipse中新建Java工程出现红色感叹号怎么解决? 其实只要在Eclipse中重新设置一下JDK路径就行了 路径:右键Java工程>>Build Path ...

  6. Linux TCP并发请求溺出 调优

    TCP并发请求溺出 调优:系统开启某个监听端口后,当多个TCP请求连接监听端后,会把多个请求交给backlog的默认监听队列由socket server一并处理,backlog有自己的队列长度默认12 ...

  7. Jira和Confluence备份恢复

    jira和confluence备份 备份脚本: #! /bin/bash echo "########################################"   TIM ...

  8. [C++ Primer Plus] 第3章、处理数据(一)程序清单

    一.程序清单3.1(变量的一些知识点) #include<iostream> #include<climits> using namespace std; void main( ...

  9. JS设计模式(12)装饰者模式

    什么是装饰者模式? 定义:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且 ...

  10. [pytorch修改]npyio.py 实现在标签中使用两种delimiter分割文件的行

    from __future__ import division, absolute_import, print_function import io import sys import os impo ...