一、泛型(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. Linux中安装Python2.7

    原文地址:http://www.jianshu.com/p/6425d18d3e47   安装依赖的库 yum -y install python-devel openssl openssl-deve ...

  2. 关于使用MUI框架ashx获取值的问题

    前台如有 var value = '<%= value%>';  后台在使用  Params["value"]的时候会出现重复(例:value,value).

  3. Qt做发布版,解决声音和图片、中文字体乱码问题(需要在main里写上QApplication::addLibraryPath("./plugins")才能加载图片,有图片,很清楚)

    前些天做Qt发布版,发现居然不显示图片,后来才发现原来还有图片的库没加!找找吧,去qt的安装包,我装在了F盘,在F盘F:/QT/qt/plugins,找到了plugins,这里面有个 imagefor ...

  4. 【题解】Luogu P2763 试题库问题

    原题传送门 这题很简单啊 从源点向k类题目分别连流量为所需数量的边 从每道题向汇点连一条流量为1的边(每题只能用1次) 从类型向对应的题目连一条流量为1的边 跑一遍最大流 如果最大流小于所需题目数量, ...

  5. 【BZOJ2301】Problem B

    Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...

  6. BZOJ 4480 [JSOI2013] 快乐的jyy

    思路 两个字符串都插入回文自动机中(每次重置last) 最后统计两个right集合的大小就好了 代码 #include <cstdio> #include <algorithm> ...

  7. Leetcode480-Binary Tree Paths-Easy

    480. Binary Tree Paths Given a binary tree, return all root-to-leaf paths. Example Example 1: Input: ...

  8. QThread使用——关于run和movetoThread的区别

    QThread 使用探讨 2010-10-23 00:30 注意:本文停止更新,请优先考虑 Qt 线程基础(QThread.QtConcurrent等) dbzhang800 2011.06.18 Q ...

  9. _skill,_skill_category

    _skill,_skill_category -- 自定义商业技能-- 小技巧:配合增加自定义商业技能._add skill [ID _skill `skillId`商业技能ID `skillIcon ...

  10. _quest_mod

    该功能实现对任务的优化,设定接受任务的条件,比如VIP等级几或者军衔多少持有何种物品才可以接受任务,同时可以配置任务的随机奖励及几率,以上修改都会在任务文本中体现.还支持任务传送功能,接完任务后,可和 ...