泛型复习

回顾泛型类

泛型类:具有一个或多个泛型变量的类被称之为泛型类
1、class A<T>{
}

2、在创建泛型实例时,需要为其类型变量赋值
A<String> a=new A<String>();
*如果创建实例时,不给类型变量赋值,那么会有一个警告!

3、泛型方法:具有一个或多个类型变量的方法,称之为泛型方法!
class A<T>{
public T fun(T t1){}
}
fun()方法不是泛型方法!它是泛型类中的一个方法!
public <T> T fun(T t1){} -->它是泛型方法
*泛型方法和泛型类没有什么关系,泛型方法不一定非要在泛型类中!

4、泛型在类中或者方法中的使用
*泛型类中使用泛型:
>成员类型
>返回值类型和参数类型
>局部变量的引用上
class A<T>{
private T bean;//泛型可在成员变量上使用
public T fun(T t){}//泛型可以在类中的方法上(返回值和参数类型)使用!

public void fun2(){//泛型还可以在局部变量的引用类型上使用
T b=...
new T();//不行的
}
}

=====================================
5、泛型的继承和实现
class A<T>{}
class AA extends A<String>{} //不是泛型类,只是它爸爸是泛型类!

5.1 继承泛型类
*子类不是泛型类:需要给父类传递类型常量
>当给父类性传递的类型常量为String时,那么在父类中所有T都会被String替换
*子类是泛型类:可以给父类传递类型常量,也可以传递泛型变量

class AA1 extends A<Integer>{}
class AA3<E1> extends A<E1>(){}

============================================
泛型的通配符
1、通配符的使用场景
方法的形参!
2、通配符的优点
使方法更加通用!

3、通配符分类
无界通配 ?
子类限定:? extends Object
父类限定:? super Integer

4、通配符缺点
使变量使用上不再方便
无界:参数和返回值为泛型的方法不能使用
子类:参数为泛型的方法不能使用
父类:返回值为泛型的方法不能使用

5、比较通配符
boolean addAll(Collection<E> c)

List<Number> numList=new ArrayList<Number>();
List<Integer> intList=new ArrayList<Integer>();
numList.add(intList);//编译失败

boolean addAll(Collection<? extends E> c)

List<Number> numList=new ArrayList<Number>();
List<Integer> intList=new ArrayList<Integer>();
numList.add(intList);

 

package cn.itcast;import org.junit.Test;public class Demo1 {@Testpublic void fun1(){AA3<Long> aa3=new AA3<Long>();}
}
class A<T>{private T t;public T fun1(){return t;}public void fun2(T t){this.t=t;}}class AA1 extends A<Integer>{}
class AA2 extends A<String>{}class AA3<E> extends A<E>(){
}package cn.itcast;import java.util.ArrayList;
import java.util.List;import org.junit.Test;public class Demo2 {@Testpublic void fun1(){Object[] objs=new Object[10];List list=new ArrayList();String[] strs=new String[10];List<String> strList=new ArrayList<String>();Object[] objArray=new String[10];objArray[0]=new Integer(100);//java.lang.ArrayStoreException: java.lang.Integer//        List<Object> objList=new ArrayList<String>();/** 泛型引用和创建两端,给出的泛型变量必须相同!*/}public void fun2(){List<Integer> integerList=new ArrayList<Integer>();print(integerList);//List<Object> list=new ArrayList<Integer>(); 
        List<String> strList=new ArrayList<String>();print(strList);}/** 这个?就是通配符* 通配符只能出现在左边!,即不能再new时使用通配符!!!* List<? extends Object> list=new ArrayList<String>();*//** ?它表示一个不确定的类型,它的值会在调用时调用下来*/public void print(List<?> list){/** 当使用通配符,对泛型类中参数为泛型的方法起到了副作用*///list.add("hello");/** 当使用通配符时,泛型类中返回值为泛型的方法也作废了*/Object s=list.get(0);/** 通配符的好处:可以使泛型类型更加通用!尤其是在方法调用时形参使用通配符*/}public void fun3(){List<Integer> intList=new ArrayList<Integer>();print1(intList);List<Long> lonList=new ArrayList<Long>();print1(lonList);//        List<String> strList=new ArrayList<String>();
//        print1(strList);
    }/** 给通配符添加了限定*     只能传递Number或其子类*     子类统配对通用性产生了影响,但使用形参更加灵活*/public void print1(List<? extends Number> list){/** 参数为泛型的方法还是不能使用*/
//        list.add(new Integer(100));/** 返回值为泛型的方法可用*/Number number=list.get(0);}public void fun4(){List<Integer> intList=new ArrayList<Integer>();print2(intList);//        List<Long> lonList=new ArrayList<Long>();
//        print2(lonList);
        List<Object> objList=new ArrayList<Object>();print2(objList);}/** 给通配符添加了限定* 只能传递Integer类型,或其父类型*/public void print2(List<? super Integer> list){/** 参数为泛型的方法可以使用了*/list.add(new Integer(100));
//        Integer int1=list.get(0);/** 返回值为泛型的方法,还是不能使用*/Object obj=list.get(0);}}

 

反射获取类上面的泛型信息:

package cn.itcast.demo1;import java.lang.reflect.ParameterizedType;import org.junit.Test;public class Demo1 {@Testpublic void fun1(){new C();}}class A<T>{public A(){/** 在这里获取子类传递的泛型信息*/
//        Type type=this.getClass().getGenericSuperclass();//获取父类的参数化类型 格式为A<String>或。。。
//        ParameterizedType pType=(ParameterizedType) type;
//        Class c=(Class) pType.getActualTypeArguments()[0];//参数的Class数组Class c=(Class)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];System.out.println(c.getName());}
}
class B extends A<Integer>{}
class C extends A<String>{}
View Code

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net core EPPlus npoi_2020 ASP.NET界面开发:DevExpress v20.1支持.NET Core设计时

DevExpress ASP.NET Web Forms Controls拥有针对Web表单(包括报表)的110种UI控件&#xff0c;DevExpress ASP.NET MVC Extensions是服务器端MVC扩展或客户端控件&#xff0c;由轻量级JavaScript小部件提供支持的70个高性能DevExpress ASP.NET Core Controls&#xff0c;包含功能…

mac电脑如何与手机同步复制粘贴_如何将电脑里的文件同步到手机里?

由于PDF的特殊性&#xff0c;一般很少有适用于手机编辑的软件&#xff0c;所以我们都习惯于使用电脑来修改PDF文档后&#xff0c;再发送到手机微信发送给其他人&#xff0c;那么如何快速将电脑里的PDF文件同步到手机里面呢&#xff1f;可能很多人会想到使用各种云盘&#xff0c…

走进缓存的世界(一) - 开篇

系列文章 走进缓存的世界&#xff08;一&#xff09; - 开篇走进缓存的世界&#xff08;二&#xff09; - 缓存设计走进缓存的世界&#xff08;三&#xff09; - Memcache概述 对于程序员来说多多少少都懂一点算法&#xff0c;算法是什么&#xff1f;算法是“时间”与“空间”的…

an 转换器_400V耐压场效应管替代IRF730B型号参数,使用在DC-DC电源转换器。_场效应管吧...

DC-DC电源转化器的应用场景逐渐广泛&#xff0c;那么适用于DC-DC电源模块的场效应管需求也随之越来越高&#xff0c;这时候电源转化器厂的电子工程师就要留意了&#xff0c;国内是否有优质的场效应管能替代IRF730B型号呢&#xff0c;其实是有的&#xff0c;FHP840其实是可以跟I…

spring MVC中页面添加锚点

2019独角兽企业重金招聘Python工程师标准>>> 需要添加锚点的代码&#xff1a; <li><a href"main/index#page1">推荐车型</a></li> <li><a href"main/index#page2">热门车型</a></li>需要跳转的…

steam一键授权工具_半个东的时间让你省了一个亿 Steam免费游戏一键领取

总所周知Steam上有很多的免费游戏&#xff0c;但是有哪些游戏是免费的呢&#xff1f;这个一时半会儿也总结不出来&#xff0c;而且还得需要大量的时间添加到自己的游戏库&#xff0c;今天这个教程就教大家如何一键添加Steam上大量免费游戏&#xff0c;需要的小伙伴赶紧收藏哦。…

YModem协议

源&#xff1a;YModem协议 YModem协议&#xff1a; YModem协议是由XModem协议演变而来的&#xff0c;每包数据可以达到1024字节&#xff0c;是一个非常高效的文件传输协议。 下面先看下YModem协议传输的完整的握手过程&#xff1a;先看下图 SENDER:发送方。 RECEIVER:接收方。 …

gcc、clang、make、cmake、makefile、CMakeLists.txt概念学习

说明 编译器是翻译代码为计算机语言的一个工具&#xff0c;我们平时写的代码如果想在某个特定的计算机上执行&#xff08;计算机的cpu构架不同&#xff09;&#xff0c;就需要编译器来对代码进行编译汇编链接&#xff0c;而汇编和链接的过程对于每个不同的平台上过程都不一样。…

视觉在无人驾驶中的应用及分类_机器视觉在智能化生产中的广泛应用

什么是机器视觉&#xff1f;顾名思义&#xff0c;简单来说&#xff0c;机器视觉就是用机器代替人眼来测量和判断。机器视觉系统是指通过机器视觉产品将被摄取目标转换成图像信号&#xff0c;传送给专用的图像处理系统&#xff0c;根据像素分布和亮度、颜色等信息&#xff0c;转…

Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程

SO_REUSEADDR选项 在上一篇文章的最后我们贴出了一个简单的C/S通信的例程。在该例程序中&#xff0c;使用"Ctrlc"结束通信后&#xff0c;服务器是无法立即重启的&#xff0c;如果尝试重启服务器&#xff0c;将被告知&#xff1a; bind: Address already in use 原因在…

work2的code和问题

//常量 package cn.itcast.work2; public class Constant { //constant 常量   public static void main(String[] args) { /* * 字符串常量 用双引号括起来的内容 * 整数常量 所有整数 * 小数常量 所有小数 * 字符常量 用单引号括起来的内容,里面只能放单个数字,单个字母或单…

Linux-(C/C++)生成并使用静态库/动态库

静态库/动态库概要 在Windows下静态库的后缀为&#xff1a;.lib、动态库后缀为&#xff1a;.dll&#xff1b;而在Linux下静态库的后缀为&#xff1a;.a、动态库的后缀为&#xff1a;.so。 那么什么是静态库呢&#xff1f; 首先我们来看看程序编译的大体流程&#xff1a;预处理…

windows下最好的围棋_学围棋能使学习成绩提高吗?

孩子几岁开始学习围棋最合适&#xff1f;当然要4岁开始学围棋。一是因为&#xff1a;4岁是幼儿形状知觉形成的关键期&#xff0c;围棋千变万化的棋形(见文后图)是最有利于促进与锻炼孩子形状知觉的形成。二是因为&#xff1a;人的大脑在3周岁后基本已经发育了60%&#xff0c;到…

C#与C/C++的交互zz

C#与C交互&#xff0c;总体来说可以有两种方法&#xff1a; 利用C/CLI作为代理中间层 利用PInvoke实现直接调用 第一种方法&#xff1a;实现起来比较简单直观&#xff0c;并且可以实现C#调用C所写的类&#xff0c;但是问题是MONO构架不支持C/CLI功能&#xff0c;因此无法实现脱…

curl查看swift状态命令_HTTP 请求与响应包括哪些,如何用Chrome查看 HTTP 请求与响应内容和curl 命令的使用...

1.HTTP的请求和响应其实就是通过电脑上的软件来进行的&#xff0c;客户端请求的内容发送到服务器上&#xff0c;服务器收到请求后就会响应客户端的请求&#xff0c;如图&#xff1a;HTTP请求的内容及格式&#xff1a;请求最多包含四部分&#xff0c;最少包含三部分。&#xff0…

Pytorch的BatchNorm层使用中容易出现的问题

前言 本文主要介绍在pytorch中的Batch Normalization的使用以及在其中容易出现的各种小问题&#xff0c;本来此文应该归属于[1]中的&#xff0c;但是考虑到此文的篇幅可能会比较大&#xff0c;因此独立成篇&#xff0c;希望能够帮助到各位读者。如有谬误&#xff0c;请联系指出…

android 比较靠谱的图片压缩

2019独角兽企业重金招聘Python工程师标准>>> 第一&#xff1a;我们先看下质量压缩方法&#xff1a; private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, …

常用公差配合表图_ER弹簧夹头配套BT刀柄常用规格型号表

ER弹簧夹头具有定心精度高&#xff0c;夹紧力均匀的特点&#xff0c;广泛用于机械类零件的精加工和半精加工&#xff0c;通常与BT刀柄匹配使用。BT刀柄是是机械主轴与刀具和其它附件工具连接件&#xff0c;BT为日本标准(MAS403)&#xff0c;现在也是普遍使用的一种标准。传统刀…

Linux下python安装升级详细步骤 | Python2 升级 Python3

Linux下python升级步骤 Python2 ->Python3 多数情况下&#xff0c;系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是&#xff0c;现在多数情况下建议使用3.x 那么如何升级呢&#xff1f; 下面老徐详细讲解升级步骤&#xff1b; 首先下载源tar包 可利用linux自带下…

华为手机连电脑_手机、电脑无网高速互传!华为神技逆天

Huawei Share是华为的一项自研多终端传输技术&#xff0c;可以在没有网络状态下实现手机与手机、电脑等多终端设备间快速稳定的文件分享&#xff0c;尤其是在办公场景下&#xff0c;可以极大提升办公效率。华为表示&#xff0c;未来Huawei Share将应用于更多全场景跨设备无缝分…