`
阅读更多

 

泛型实质上就是程序员定义安全的类型。

 

一、回顾“向上转型”与“向下转型”

 

向上转型是安全的, 

         * 但是执行“向下转型”操作时用错了类型或者并没执行该操作: 

         * 并不存在语法错误,可以被编译器接受,但执行时会出现 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

 

1
0
分享到:
评论

相关推荐

    day02_Collection、泛型每日作业卷2

    3. **泛型**:泛型是Java SE 5.0引入的新特性,允许在类、接口和方法中使用类型参数,增强了代码的类型安全性和效率。泛型可以限制容器中存储的数据类型,避免了强制类型转换,并在编译时检查类型错误。 4. **数组...

    day02_Collection、泛型每日作业卷答案 2

    集合框架是Java编程语言中一个核心的组件,它提供了数据结构和算法的抽象,使得开发者可以方便地管理和操作数据。在Java中,集合框架主要由两个大类组成:单列集合`java.util.Collection`和双列集合`java.util.Map`...

    黑马程序员-Java语言进阶-源码、教程笔记.zip

    day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda表达式 day08_File类、递归 day09_字节流、字符流...

    21day_learn_java.rar_DayCounter.java

    学习者可以逐渐了解并掌握Java中的各种重要概念,如变量声明与初始化、基本数据类型与操作、数组、控制流语句(如if-else、switch、for和while循环)、面向对象编程(OOP)的核心概念(类、对象、继承、多态)、以及...

    Day17 Java 集合和泛型.pdf

    Java集合框架是Java编程语言中用于存储和操作对象集合的一组接口和类。在Java中,集合通常分为三大类:List、Set和Map。本知识点主要关注于Map接口的介绍和几种Map实现类的详解。 首先,Map是一个键值对集合,其中...

    day07Collection集合_泛型.md

    集合是Java编程语言中一种重要的数据结构,它能够存储多个数据项。集合的设计初衷是为了提供一种更加灵活、高效的方式来处理数据集合问题,相较于传统的数组,集合提供了更多的功能与便利性。 #### 集合与数组的...

    尚硅谷java 2019练习.zip

    尚硅谷java 2019练习JAVA学习目录day01_JAVA语言概述与基本语法标识符、变量分类、源码_反码_补码、认知转换、编码与字符集day02_基本....java 集合List、Set、Map接口、队列、StackStackday14_泛型day14_

    Java基础知识-day02【Collection、泛型】.pdf

    Java基础知识-day02【Collection、泛型】 本节课程主要讲解了 Java 中的 Collection 框架和泛型,涵盖了 Collection 的基本概念、Collection 框架的继承结构、Collection 的常用功能、迭代器的使用和泛型的定义等...

    day17 java

    创建一个新的Java工程,可以通过菜单栏的File -&gt; New -&gt; Java Project,然后输入工程名称,比如按照学习进度命名(例如day01)。 **Eclipse使用技巧:** 1. **创建Java工程**:通过File -&gt; New -&gt; Java Project,...

    day02【Collection、泛型】

    day02【Collection、泛型】

    atguigu_Day_01随堂笔记1.pdf

    例如,Java 5.0引入了泛型和枚举等新特性,Java 8则引入了Lambda表达式、方法引用来增强函数式编程能力,并且是长期支持(LTS)版本。自Java 9起,Oracle开始实行每半年发布一个新版本的策略,但不再支持某些旧系统...

    Java快速入门教程资料_Java快速入门教程资料_JAVA教程资料_most5st_源码

    - `day06资料`:涵盖ArrayList、LinkedList、HashSet、HashMap等集合类的使用,以及泛型、迭代器的概念。 7. **IO流** - `day07资料`:介绍输入/输出流的基本概念,包括文件操作、字节流和字符流的使用,以及缓冲...

    传智播客_java基础知识汇总

    7. **day17JDK5.0新特性与正则表达式.doc**:JDK 5.0引入了许多新特性,如枚举、泛型、匿名内部类、变量类型推断(var关键字的前身)等。正则表达式则是字符串处理的强大工具,用于模式匹配和搜索替换。 这些文档...

    Java_day15上课资料.zip

    7. **泛型**:Java泛型允许在编译时检查类型安全,并且可以消除强制类型转换。了解泛型的使用和限制有助于编写更安全、更灵活的代码。 8. **接口与抽象类**:接口和抽象类都是实现多态的方式,但它们有各自的应用...

    JavaSE基础入门视频教程33天之(18) part2

    `day18_15(集合框架)Java中的伪泛型.avi`可能涉及了Java历史上的一个特殊现象,由于历史兼容性原因,Java泛型是类型擦除的,因此有时会看到所谓的“伪泛型”,这通常是指在代码中使用了未指定类型的集合,但仍然保持...

    毕向东_Java基础视频源代码

    "day21"和"day24"可能是课程的高潮部分,可能包含了面向对象编程的深入探讨以及Java中的高级特性,如反射、线程同步或泛型。 整个课程配套的源代码文件是学员们动手实践的宝贵资源。学员可以跟随视频课程,亲自编写...

    day017-Map和泛型 代码和笔记.rar

    day017-Map和泛型 代码和笔记.rar 1. Map:地图 2. Properties类:常用来做配置文件 (掌握) 3. 泛型:就是一个占位符号而已,在设计类的时候,占用位置就是在设计类(接口等)的时候,没有给规定具体是什么类型...

    Scala_day01_scala_

    总的来说,"Scala_day01.docx"这份文档应该涵盖了Scala的基本语法、函数式编程特性、并发模型以及与其他Java技术的互操作性等方面的内容。通过深入学习,初学者将能够掌握Scala的核心概念,并开始编写自己的Scala...

    学习笔记 java\CoreJava笔记\CoreJava_day15

    以下是对"CoreJava_day15"学习笔记中可能涉及的一些关键知识点的详细解释: 1. **异常处理**: - 异常是程序运行时出现的错误,Java通过Exception类及其子类来表示这些错误。在Java中,异常处理使用try-catch-...

Global site tag (gtag.js) - Google Analytics