Java泛型的学习笔记[1]—基础知识

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。本文主要描述的是泛型类

   Java语言引入泛型的好处:1)最大程度的保证了类型安全;2)简化编译

   我们以ArrayList类为例:

   1)如果没有泛型,我们要不然需要为每一种类型X编写一个XArrayList类;要不然在ArrayList中用Object的对象来存储数据,然后每次取出对象时使用类型转换;

           2)而我们使用了泛型方式来定义ArrayList:public class ArrayList<T>{}  ,既保证了每次使用ArrayList时的类型安全,又简化了实现ArrayList的编程工作。

   好了,下面我们还是先抛出泛型类的概念和特性:

基础概念:

   泛型类实际就是一个带参数的类。泛型类定义可以有多个泛型参数,中间用逗号隔开。泛型的概念也存在于C++和C#语言中。如同如下代码:

public class MyList<T> {
	private List<T> list=new ArrayList<T>();
	public T get(int index){
		return list.get(index);
	}
	//此处省略了若干内容....
}

受限制的泛型类定义:
  假设我们定义了以下三个类:

   

  现在我就想专门针对上述三个类编写一个List类,则如下代码如示:

public class MyList<T extends Animal> {
	private List<T> list=new ArrayList<T>();
	public T get(int index){
		return list.get(index);
	}
	//此处省略了若干内容....
}

 

  如此的话,就可以将MyList的类参数的使用限制在Animal及其子类了。如果违反这个规则,编译期就会报错的。这样,就很大程度上保证了类型安全。

  MyList<Object> list=null;//编译出错

通配符泛型:
  有时在使用泛型类时,遇到不太确定参数的类型,可以用?代替。尤其是在做Java反射时:

  Class<?> clazz=Class.forName(className);

  受限制的通配符类型:但有时,你虽然不能确定类参数的具体类型,但是你能确定它大概的类型,比如该参数类型是Animal或者是其子类。

  此时可以这样用:Class<? extends Animal> clazz=Class.forName(className);

       需要注意的是:通配符不仅可以向下限制[通配符代表某类型或某类型的子类],还可以向上限制[通配符代表某类型或是某类型的父类]

  比如:Class<? super Cat>  clazz=Class.forName(className);//表示?代表的是Cat或Cat的基类Animal

  当然,还有一些其它的例子来描述通配符:

  比如定义一个变量:List<? extends Animal> animals=new ArrayList<Cat>();

      本人写作功底不行,请见谅。

  下一文:关于泛型的实际使用及使用中遇到的问题

时间: 2024-09-26 22:17:46

Java泛型的学习笔记[1]—基础知识的相关文章

java泛型的学习笔记[2]—实际使用

继上一文<java泛型的学习笔记[1]-基础知识>之后,本文将介绍泛型的一些应用和应用过程中遇到的问题. 在此之前,我们先给出一张类图:   1)泛型类型的子类型问题 我们首先来看这样一句代码.该行代码正确,因为Cat是Animal的子类型 Animal animal=new Cat();// 但是再看下一句代码: AarrayList<Animal> animals=new ArrayList<Cat>();//编译出错        这句代码编译出错,因为虽然因为C

JavaScript中的Number数字类型学习笔记_基础知识

使用IEEE754格式来表示整数和浮点数值.浮点数值:该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字.浮点数值需要内存空间是保存整数值的两倍.最高精度是17为小数,但在进行算术运算时其精度远远不如整数. 各种数值类型:十进制,八进制(在严格模式下无效),十六进制 八进制字面量的第一位必须是0,然后是八进制数字序列(0~7).如果字面值中的数值超出了范围,那么前导0将被忽略,后面的数值将被当做十进制数来解析 070//56 079//79 十六进制字面值的前两位必须是0x,后跟十六进

[转]JS宝典学习笔记_基础知识

1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5.得到表单中元素的名称和值:document.getElementById("表单中元素的ID号").name(或value) 6.一个小写转大

Javascript Object 对象学习笔记_基础知识

构造函数new Object() new Object(value) 参数value     可选的参数,声明了要转换成Number对象.Boolean对象或String对象的原始值(即数字.布尔值或字符串).JavaScript 1.1之前的版本和ECMAScript Vl不支持该对象. 返回值 如果没有给构造函数传递value参数,那么它将返回一个 新创建的Object实例.如果指定了原始的value参数,构造函数将创建并返回原始值的包装对象,即Number对象.Boolean对象或 Str

Ruffy javascript 学习笔记_基础知识

1,javascript的原型模型:prototype 在实现面向对象,(像是定义一个类的时候)需要一个构造函数来定义对象的成员,而方法去依附在该构造函数的原型上. 2,javascript中,为了实现继承,必须将子类构造函数的prototype设置为一个父类的对象实例. 3,css的方块套方块模型: 最外是margin 是用来设置一个元素所占的空间的边缘到相邻元素的距离 边框:border 用来设定一个元素的连线 padding 用来设置元素内容互元素边框的距离 还有背景属性是content

JavaScript基础知识学习笔记_基础知识

JavaScript简介 一.定义:JavaScript是脚本语言,需要宿主文件,它的宿主文件是html文件. JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编程代码. JavaScript 插入 HTML 页面后,可由所有的现代浏览器执行. 二.用法: 在html中的位置有三块: 1)head里面: 2)body里面: 3)</html>之后,为了保险起见一般写在</html>之后.<script language=&quo

Java中jqGrid 学习笔记整理——进阶篇(二)_java

相关阅读: Java中jqGrid 学习笔记整理--进阶篇(一) 本篇开始正式与后台(java语言)进行数据交互,使用的平台为 JDK:java 1.8.0_71 myEclisp 2015 Stable 2.0 Apache Tomcat-8.0.30 Mysql 5.7 Navicat for mysql 11.2.5(mysql数据库管理工具) 一.数据库部分 1.创建数据库 使用Navicat for mysql创建数据库(使用其他工具或直接使用命令行暂不介绍) 2. 2.创建表 双击打

mybatis学习笔记之基础框架(2)

mybatis学习笔记之基础框架(2) mybatis是一个持久层的框架,是apache下的顶级项目. mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足sql语句 mybatis可将向prparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象.(输出映射) SqlMapConfig.xml(是mybatis的全局配置文件,名称不固定) 配置了数据源/事务等mybatis运行环境 配置映射文件(配置sql语句) m

java高手之路上的必备基础知识

其实Java也就这么回事,重要的还是坚持,不能三天打鱼两天晒网.每一个分支下都是一门专业的技术,重要的是证明学精,熟练运用各项软件语言. 下面和大家分享java高手之路上的必备基础知识: 1.面向对象 JAVA是一个面向对象的开发语言,因此熟悉面向对象对学习JAVA很有必要,您要了解:什么是对象,什么是类;什么是封装,什么是多态,什么是继承;什么是抽象类,什么是接口.了解了概念后,您还需要这些概念是如何体现的,如类和对象有什么区别?类是如何封装的? 2.JAVA语法 如果您有C++等面向对象语言