泛型实质上就是程序员定义安全的类型。
一、回顾“向上转型”与“向下转型”
向上转型是安全的,
* 但是执行“向下转型”操作时用错了类型或者并没执行该操作:
* 并不存在语法错误,可以被编译器接受,但执行时会出现 java.lang.ClassCastException
package day22;
public class reviewupdown {
public static void main(String[] args) {
/*回归向上转型、向下转型*/
T m = new T();
/*向上转型*/
m.setB(new Boolean(true));
System.out.println(m.getB());
/*向下转型*/
m.setB(new Float(12.3));
Float f = (Float) m.getB();
System.out.println(f);
/*“向上转型是安全的,
* 但是执行“向下转型”操作时用错了类型或者并没执行该操作:
* 并不存在语法错误,可以被编译器接受,但执行时会出现 java.lang.ClassCastException”*/
m.setB(new Float(11.4));
Integer i = (Integer) m.getB();
System.out.print(i);
}
}
class T{
private Object B;
public Object getB() {
return B;
}
public void setB(Object b) {
B = b;
}
}
运行结果:
true
12.3
Exception in thread "main" java.lang.ClassCastException: java.lang.Float cannot be cast to java.lang.Integer
at day22.reviewupdown.main(reviewupdown.java:20)
二、定义泛型类
1、在JDK1.5版本后,提出泛型
格式:
类名<T>
T:代表一个类型的名称。
2、代码案例
package day22;
public class GenericTest {
public static void main(String[] args) {
OverClass<Float> f = new OverClass<Float>(); //实例化一个Float对象
OverClass<Integer> c = new OverClass<Integer>();//实例化一个Integer对象
f.setOver(11.6f);
c.setOver(7);
Float f2 = f.getOver();//不需要类型转换
Integer c2 = c.getOver();//不需要类型转换
System.out.println(f2);
System.out.println(c2);
}
}
class OverClass<T>{ //定义泛型类
private T over; //定义泛型成员变量
public T getOver() {//设置getXXX()方法
return over;
}
public void setOver(T over) { //设置setXXX()方法
this.over = over;
}
}
运行结果:
11.6
7
解析:
在类名后添加了一个<T>语句,使用了泛型机制。
可以将OverClass称为泛型类,同时返回和接受的参数使用T这个类型。
三、泛型的常规用法
1、定义泛型类时,可以声明多个类型
语法:
MutiOverClass<T1,T2>
MutiOverClass:类型名称
这样在实例化指定类型的对象时就可以指定多个类型。
2、定义泛型类时声明数组类型
代码案例:
package day22;
public class GenericTest {
public static void main(String[] args) {
/*定义泛型类时声明数组类型*/
ArrayClass<Integer> arr = new ArrayClass<Integer>();
Integer m[] = {1,2,3,4,5};
arr.setTt(m);
for(int i = 0;i < arr.getTt().length;i++) {
System.out.print(arr.getTt()[i]);
System.out.print(" ");
}
}
}
class ArrayClass<T> {
private T[] tt; //定义泛型数组
public T[] getTt() { //获取成员数组
return tt;
}
public void setTt(T[] tt) { //设置setXXX()为成员数组赋值
this.tt = tt;
}
}
运行结果:
1 2 3 4 5
三、集合类声明容器的元素
这些集合框架已经被泛型化,可以直接使用。
四、泛型的高级用法
4.1 限制泛型可用类型
默认可以使用任何类型来实例化一个泛型类对象,但是Java中也对泛型类实例的类型作了限制。
语法:
class 类名称<T extends anyClass>
其中, anyClass为类或接口
代码案例:
package day22;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
public class LimitClass <T extends List>{
public static void main(String[] args){
/*可以实例化实现List接口的类*/
LimitClass<ArrayList> l1 = new LimitClass<ArrayList>();
LimitClass<LinkedList> l2 = new LimitClass<LinkedList>();
/*这句是不对的,因为HashMap没实现List()接口
LimitClass<HashMap> l3 = new LimitClass<HashMap>();*/
}
}
解析:
将泛型作了限制,设置泛型类型必须实现List接口。
4.2 使用类型通配符
1.在泛型机制中,提供了类型通配符,
其主要作用是:
在创建一个泛型类对象时限制这个泛型类的类型实现或继承某个接口或类的子类。
声明这样的对象可以使用“?”来表示,同时依然使用extends关键字来对泛型加以限制。
2.格式:
泛型类名称<? extends List> a = null;
<? extends List>表示类型未知,当需要使用该泛型对象时,可以单独实例化。
如:
A<? extends List> a = null;
a = new A<ArrayList>();
a = new A<LinkedList>();
3.在泛型中使用通牌符形式
List<String> l1 = new List<String>();//实例化一个ArrayList对象
l1.add("aaa");//在集合中添加字符
List<?> l2 = l1;//使用通配符
List<?> l3 = new LinkedList<Integer>();
System.out.println(l2.get(0));//获取集合中的第一个值
注意:
这l1 和 l2的区别使用通配符声明的名称实例化的对象不能对其进行加入新的值,只能获取或删除。
4.3继承泛型类与实现泛型接口
4.3.1 在项目中创建一个类文件,在该类中继承泛型类
public class ExtendClass<T1>{
//..}
class SubClass<T2,T3> extends ExtendClass<T1>{
//..}
注意:
需要指明ExtendClass<T1>;
如果Exte会ndClass,则T1,T2,T3都会自动变成Object。
所以在一般情况下都将父类的泛型类型保留。
4.3.2定义的泛型接口也可以被实现,implements
泛型总结:
1.泛型的类型参数只能是类类型
2.泛型的类型个数可以是多个
3.可以使用extends关键字限制泛型的类型
4.可以使用通配符限制泛型的类型
星期一, 十一月 23, 2015 22:53:52
相关推荐
3. **泛型**:泛型是Java SE 5.0引入的新特性,允许在类、接口和方法中使用类型参数,增强了代码的类型安全性和效率。泛型可以限制容器中存储的数据类型,避免了强制类型转换,并在编译时检查类型错误。 4. **数组...
集合框架是Java编程语言中一个核心的组件,它提供了数据结构和算法的抽象,使得开发者可以方便地管理和操作数据。在Java中,集合框架主要由两个大类组成:单列集合`java.util.Collection`和双列集合`java.util.Map`...
day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda表达式 day08_File类、递归 day09_字节流、字符流...
Java集合框架是Java编程语言中用于存储和操作对象集合的一组接口和类。在Java中,集合通常分为三大类:List、Set和Map。本知识点主要关注于Map接口的介绍和几种Map实现类的详解。 首先,Map是一个键值对集合,其中...
集合是Java编程语言中一种重要的数据结构,它能够存储多个数据项。集合的设计初衷是为了提供一种更加灵活、高效的方式来处理数据集合问题,相较于传统的数组,集合提供了更多的功能与便利性。 #### 集合与数组的...
Java基础知识-day02【Collection、泛型】 本节课程主要讲解了 Java 中的 Collection 框架和泛型,涵盖了 Collection 的基本概念、Collection 框架的继承结构、Collection 的常用功能、迭代器的使用和泛型的定义等...
创建一个新的Java工程,可以通过菜单栏的File -> New -> Java Project,然后输入工程名称,比如按照学习进度命名(例如day01)。 **Eclipse使用技巧:** 1. **创建Java工程**:通过File -> New -> Java Project,...
day02【Collection、泛型】
例如,Java 5.0引入了泛型和枚举等新特性,Java 8则引入了Lambda表达式、方法引用来增强函数式编程能力,并且是长期支持(LTS)版本。自Java 9起,Oracle开始实行每半年发布一个新版本的策略,但不再支持某些旧系统...
- `day06资料`:涵盖ArrayList、LinkedList、HashSet、HashMap等集合类的使用,以及泛型、迭代器的概念。 7. **IO流** - `day07资料`:介绍输入/输出流的基本概念,包括文件操作、字节流和字符流的使用,以及缓冲...
"day24"可能是课程的总结或进阶内容,比如反射、线程同步或者泛型等高级特性。 这些源代码文件是学员跟随视频课程动手实践的宝贵资料,通过实际编写和运行代码,可以加深对Java语言的理解,提高编程能力。每个day的...
7. **day17JDK5.0新特性与正则表达式.doc**:JDK 5.0引入了许多新特性,如枚举、泛型、匿名内部类、变量类型推断(var关键字的前身)等。正则表达式则是字符串处理的强大工具,用于模式匹配和搜索替换。 这些文档...
7. **泛型**:Java泛型允许在编译时检查类型安全,并且可以消除强制类型转换。了解泛型的使用和限制有助于编写更安全、更灵活的代码。 8. **接口与抽象类**:接口和抽象类都是实现多态的方式,但它们有各自的应用...
`day18_15(集合框架)Java中的伪泛型.avi`可能涉及了Java历史上的一个特殊现象,由于历史兼容性原因,Java泛型是类型擦除的,因此有时会看到所谓的“伪泛型”,这通常是指在代码中使用了未指定类型的集合,但仍然保持...
day017-Map和泛型 代码和笔记.rar 1. Map:地图 2. Properties类:常用来做配置文件 (掌握) 3. 泛型:就是一个占位符号而已,在设计类的时候,占用位置就是在设计类(接口等)的时候,没有给规定具体是什么类型...
总的来说,"Scala_day01.docx"这份文档应该涵盖了Scala的基本语法、函数式编程特性、并发模型以及与其他Java技术的互操作性等方面的内容。通过深入学习,初学者将能够掌握Scala的核心概念,并开始编写自己的Scala...
以下是对"CoreJava_day15"学习笔记中可能涉及的一些关键知识点的详细解释: 1. **异常处理**: - 异常是程序运行时出现的错误,Java通过Exception类及其子类来表示这些错误。在Java中,异常处理使用try-catch-...
"Java_day21上课资料.zip"这个压缩包文件很可能是某个在线课程或教学计划的一部分,旨在帮助学习者深入理解Java语言的核心概念和技术。从描述中的链接我们可以推测,这可能是一个视频课程的配套资料,学生可以通过...
本资料“Java_day02上课资料.zip”旨在帮助初学者深化对Java的理解,进一步掌握编程技能。资料配套的视频课程可在B站(哔哩哔哩)上找到,链接为,为学习过程提供了互动性的教学资源。 在这个压缩包中,你可能会...