泛型(Generic)

为什么要有泛型?

1.解决元素存储的安全性问题

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

服用前:

服用后:

 

    泛型,JDK1.5新加入的,解决数据类型的安全性问题,其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化时只要指定好需要的具体的类型即可。

        Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。

使用泛型

泛型的声明

  interface List<T>和class TestGen<K,V>

其中,T,K,V不代表值,而是表示类型。这里使用任意字母都可以。常用T表示,是Type的缩写。

泛型的实例化:

一定要在类名后面指定类型参数的值(类型)。如:

List<String> StrList = new ArrayList<String>();

iterator<Customer> iterator = customers.iterator();

  T只能是类,不能用基本数据类型填充。

泛型的几个重要使用

1.在集合中使用泛型

2.自定义泛型类

3.泛型方法

4.泛型接口

对于泛型类

1.对象实例化时不指定泛型,默认为:Object

2.泛型不同的引用不能相互赋值。

3.加入集合中的对象类型必须与指定的泛型类型一致。

4.静态方法中不能使用类的泛型。

5.如果泛型类是一个接口或抽象类,则不可创建泛型类的对象。

6.不能在catch中使用泛型

7.从泛型类派生子类,泛型类型需具体化

自定义泛型类

 1 class Person<T>{
 2     //使用T类型定义变量
 3     private T info;
 4     //使用T类型定义一般方法
 5     public T getInfo(){
 6         return info;
 7     }
 8     public void setInfo(T info){
 9         this.info=info;
10     }
11     //使用T类型定义构造器
12     public Person(){}
13     public Person(T info){
14         this.info=info;
15     }
16     //static的方法中不能声明泛型
17 //    public static void show(T t){
18 //        
19 //    }
20     //try{}
21     //catch(T t){}
22 }

对于泛型方法

方法,也可以被泛型化,不管此时定义在其中的类是不是泛型化的。在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。

泛型方法的格式:

[访问权限]<泛型>返回类型 方法名([泛型标识 参数名称])抛出的异常

public class DAO{

  public<E> E get(int id,E e){

  E result = null;

  return result;

}

}

static <T> void fromArrayToCollection(T[] a, Collection<T> c) {

  for (T o : a) {

  c.add(o);

  }  }

 

public static void main(String[] args) {

  Object[] ao = new Object[100];

  Collection<Object> co = new ArrayList<Object>();

  fromArrayToCollection(ao, co);

 

  String[] sa = new String[20];

  Collection<String> cs = new ArrayList<>();

  fromArrayToCollection(sa, cs);

 

  Collection<Double> cd = new ArrayList<>();

  // 下面代码中T是Double类,但sa是String类型,编译错误。

  // fromArrayToCollection(sa, cd);

  // 下面代码中T是Object类型,sa是String类型,可以赋值成功。

  fromArrayToCollection(sa, co);  }

泛型和继承的关系

如果B是A的一个子类型(子类或者子接口),而G是具有有泛型声明的类或接口,G<B>并不是G<A>的子类型!

比如:String是Object的子类,单List<String>并不是List<Object>的子类

通配符

1.使用类型通配符:?

比如:List<?>,Map<?,?>

List<?>是List<String>、List<Object>等各种泛型List的父类。

2.读取List<?>的对象list中的元素时,永远是安全的,因为不管list的真实类型是什么,它包含的都是Object。

3.写入list中的元素时,不行。因为我们不知道c的元素类型,我们不能向其中添加对象。

  唯一的例外是null,它是所有类型的成员。

将任意元素加入到其中不是类型安全的:

Collection<?> c=new ArrayList<String>();

c.add(new Object());//编译时错误

因为我们不知道c的元素类型,我们不能向其中添加对象

  add方法有类型参数E作为集合的元素类型。我们传给add的任何参数都必须是一个未知类型的子类。因为我们不知道那是声明类型,所以我们无法传递任何东西进去。

唯一的例外是null,它是所有类型的成员。

另一方面,我们可以调用get()方法并使用其返回值。返回值是一个未知的类型,但是我们知道,它总是一个Object

有限制的通配符

<?>

允许所有泛型的引用调用

举例:

<? extends Number>     (无穷小 , Number]

只允许泛型为Number及Number子类的引用调用

 

<? super Number>      [Number , 无穷大)

只允许泛型为Number及Number父类的引用调用

 

<? extends Comparable>

只允许泛型为实现Comparable接口的实现类的引用调用

 

转载于:https://www.cnblogs.com/liangxiaoyu/p/5137614.html

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

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

相关文章

官宣!DevExpress Blazor UI组件,支持全新的.NET 8渲染模式

DevExpress Blazor UI组件使用了C#为Blazor Server和Blazor WebAssembly创建高影响力的用户体验&#xff0c;这个UI自建库提供了一套全面的原生Blazor UI组件&#xff08;包括Pivot Grid、调度程序、图表、数据编辑器和报表等&#xff09;。 .NET 8为Blazor引入了令人兴奋的重…

linux内核源码树

linux内核源码树扫盲分析 sudo apt-get install tree //下载tree tree //输入指令(该指令可以检查第三方工具包里的内容是否完整)可以看到如图的树状结构&#xff1a; linux内核源码&#xff1a; 为什么内核大约1.3w个c文件&#xff0c;1100w行代码&#xff1f; linux是一个开…

负载均衡很难?看完这篇全懂了

来自&#xff1a;金钟路上小码工链接&#xff1a;https://www.cnblogs.com/danbing/p/7459224.html一、什么是负载均衡&#xff1f;互联网早期&#xff0c;业务流量比较小并且业务逻辑比较简单&#xff0c;单台服务器便可以满足基本的需求&#xff1b;但随着互联网的发展&#…

配置树莓派linux的内核和编译并将镜像拷贝至树莓派

驱动代码的编写需要一个提前编译好的内核&#xff0c;编译内核就必须配置&#xff0c;配置的最终目标会生成.config文件&#xff0c;该文件指导makefile去把有用的东西组织成内核。 如何生成.config文件&#xff1a; 第一种方式&#xff1a; 厂家配linux内核源码&#xff0c;比…

h5 与原生 app 交互的原理

作者&#xff1a;senntyousegmentfault.com/a/1190000016759517现在移动端 web 应用&#xff0c;很多时候都需要与原生 app 进行交互、沟通&#xff08;运行在 webview中&#xff09;&#xff0c;比如微信的 jssdk&#xff0c;通过 window.wx 对象调用一些原生 app 的功能。所以…

【ROS问题】rqt_plot运行报错

本人Linux版本&#xff1a;Ubuntu 18.04 LTS ROS版本&#xff1a;Melodic 方案一&#xff1a; 你看那个报错&#xff0c;全是Matplotlib的报错&#xff0c;是这个东西版本不够高&#xff0c;重新安装就好啦。 python -m pip install -U pip python -m pip install -U matp…

BCP使用笔记整理

一、BCP 简介大容量复制程序实用工具 (bcp) 可以在 Microsoft SQL Server 实例和用户指定格式的数据文件间大容量复制数据。 使用 bcp 实用工具可以将大量新行导入 SQL Server 表&#xff0c;或将表数据导出到数据文件。 除非与 queryout 选项一起使用&#xff0c;否则使用该实…

怎样基于谷歌地图的Server缓存公布Image Service服务

怎样基于谷歌地图的Server缓存公布Image Service服务第一步&#xff1a;下载地图数据下载安装水经注万能地图下载器&#xff0c;启动时仅仅选择电子.谷歌&#xff08;这里能够依据自己的须要选择&#xff09;。例如以下图所看到的。找到成都后框选下载成都区域&#xff0c;例如…

整理的一些比较基础的面试知识点

1、面向对象的三大特性或其具体体现在哪 2、页面间传值方式 3、session cookie原理及区别 4、hasstable&#xff0c;dictionary&#xff0c;List &#xff0c;collection 5、类和抽象类&#xff0c;类和接口&#xff0c;接口和抽象类区别及适合场景 6、Get和Post比较优缺点或区…

五种类型的程序员,你属于哪一种?

在我的编程生涯中,我碰到过很多奇奇怪怪的对手和同盟。我把这些编码战士们分成五类&#xff0c;有些人是你队伍中的好伙伴&#xff0c;有些人则是捣蛋者&#xff0c;让你的每一个计划都完不成。不管怎么说&#xff0c;他们在软件开发的诸神殿上都占有一席之地。如果你的团队中没…

一些有用的js插件

getfuelux.com 一系列插件合集 Ion.RangeSlider 超级牛的范围选择控件 Ion.CheckRadio Ion.Tabs Ion.Calendar Ion.ImageSlider Ion.Zoom www.ngwidgets.com Advanced UI Widgets for AngularJS http://www.jq22.com/ jQuery 插件库 http://jvectormap.com/ 地图插件 X-…

C# FTP操作类库

class FTP_Class{string ftpServerIP;string ftpUserID;string ftpPassword;FtpWebRequest reqFTP; #region 连接/// <summary>/// 连接FtpWebRequest/// </summary>/// <param name"path"></param>private void Connect(String path)/…

安装并配置ROS环境

参考该网址内容&#xff1a;http://wiki.ros.org/cn/ROS/Tutorials/InstallingandConfiguringROSEnvironment

Cropper – 简单的 jQuery 图片裁剪插件

Cropper 是一个简单的 jQuery 图像裁剪插件。它支持选项&#xff0c;方法&#xff0c;事件&#xff0c;触摸&#xff08;移动&#xff09;&#xff0c;缩放&#xff0c;旋转。输出的裁剪数据基于原始图像大小&#xff0c;这样你就可以用它们来直接裁剪图像。 如果你尝试裁剪跨域…

C# JSON格式数据用法

JSON简介JSON(全称为JavaScript ObjectNotation) 是一种轻量级的数据交换格式。它是基于JavaScript语法标准的一个子集。JSON采用完全独立于语言的文本格式&#xff0c;可以很容易在各种网络、平台和程序之间传输。JSON的语法很简单&#xff0c;易于人阅读和编写&#xff0c;同…

Ros命令及功能

运行小乌龟代码&#xff1a; roscore rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key一些命令及作用 ros 加tap //查看电脑中以ros开头的命令 rqt_graph //将系统内的主要资源以可视化的形式展现出来 rosnode list //列出系统节点 命令 --help //查看命…

数据库——环境初建改端口和密码(转)

一、修改APACHE的监听端口 2、在界面中选apache&#xff0c;弹出隐藏菜单选项&#xff0c;打开配置文件httpd.conf; 2、找到Listen 80 和 ServerName localhost:80; 3、将80改成801&#xff08;当然自己也可以设定别的不使用的端口&#xff0c;例如8000等&#xff09;; 4、保存…

文件系统认知

什么是文件系统 常规认知是&#xff1a;linux根目录那些东西 百科&#xff1a;文件系统是操作系统用于明确存储设备组织文件的方法&#xff0c;操作系统中负责管理和存储文件信息的软件机构称为文件管理系统&#xff0c;简称文件系统。 以上说的方法&#xff1a;就是文件管理…

寒哥细谈之AutoLayout全解

看到群中好多朋友还停留在Frame布局的痛苦时代&#xff0c;以及有些开发者接手别人的就项目发现布局一团乱。而且没有启动图的时候并不是真正真正适配iPhone 6(S)、iPhone6(S) Plus等设备 。寒哥准备尽可能详细的讲一讲我所掌握的AutoLayout 。AutoLayout很难&#xff1f;我觉得…

最难学的5种编程语言排行

每个程序员都熟悉许多编程语言。许多编程语言都是高级的&#xff0c;它们的语法是人类可读的。然而&#xff0c;也有一些低级语言&#xff0c;对于一个人来说&#xff0c;读起来很困难&#xff0c;但是可以理解。然而&#xff0c;您是否遇到过一种既不可读又不可理解的编程语言…