`

java 之泛型-学习笔记

阅读更多

package com.sample.client;


import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;


import org.junit.Test;


/**

 * java 之泛型

 * 泛型是JDK1.5+的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类,

 * 接口,方法的创建中,分别称之为泛型类、泛型接口、泛型方法。

 * 简概:泛型只是编译时的概念,供编译器进行语法检查使用的(编程时需要一种类型安全的集合),以此提高程序的可读性和稳定性。

 * 目的:

 * 1、努力将运行时异常转换成编译时错误,减少运行时异常数量(提高了编译器能力)

 * 2、决解模板编程的问题

 * 基本语法:属性中使用集合时,用<>指定集合中可以放入的类型。

 * 以ArrayList<E>为例:<>表示为typeof

 * ArrayList<E>中的E称为类型参数变量

 * ArrayList<Integer>中的Integer称为实际类型参数

 * 整个称为ArrayList<E>泛型类型

 * 整个ArrayList<Integer>称为参数化的类型ParameterizedType

 * 注意:

 * 1、泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即可挡住翔集合中插入非法数据。

 * 但编译器编译完所有泛型的java程序后,生成class文件中将不再带有泛型信息,以此使程序运行效率不受到影响,这个过程称之为"擦除"。

 * 2、属性中使用集合时不指定泛型,默认为<Object>

 * 3、泛型不同的引用于对象之间都是不兼容的

 * 4、引用的泛型于对象的泛型必须一致

 * 

 * @author Administrator

 *

 */

public class TestGenerics {

@Test public void testGenerics1() {

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

l.add("ABC");

l.add("DEF");

String str = l.get(0);//使用泛型后,获得对象时不用引进强制类型转换

/*

* 编译错误,试图将Integer和Double类型的对象放入指定存放String类型对象的集合中

* l.add(1);

* l.add(1.5);

*/

}

/**

* 泛型的通配符(用于方法的参数)

* 1、<?> 允许所有泛型的引用调用

* 2、<? extends Number> 只允许泛型为Number以及Number子类的引用调用

* 3、<? super Number> 只允许泛型为Number以及Number父类引用调用

* 4、<? extends Comparable> 只允许泛型为实现Comparable接口的实现类引用调用

*/

@Test public void testGenerics2() {

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

List<Object> l2 = new ArrayList<Object>();

List<Number> l3 = new ArrayList<Number>();

List<Integer> l4 = new ArrayList<Integer>();

List<Double> l5 = new ArrayList<Double>();

print1(l1);//可调用l1、l2、l3、l4、l5

print2(l2);//可调用l1、l2、l3、l4、l5

print3(l3);//可调用l3、l4、l5

print4(l4);//可调用l1、l3、l4、l5

print5(l3);//可调用l1、l3

}

//方法参数中使用集合时不指定泛型,默认为<?>

public static void print1(List list) {

for(Object o : list) {

System.out.println(o);

}

}

//<?> 允许所有泛型的引用调用

public static void print2(List<?> list) {

for(Object o : list) {

System.out.println(o);

}

}

//<? extends Number> 只允许泛型为Number及Number子类引用调用

public static void print3(List<? extends Number> list){

for(Number o:list){

System.out.println(o);

}

}

//<? extends Comparable> 只允许泛型为实现了Comparable接口的实现类引用调用

public static void print4(List<? extends Comparable> list){

for(Comparable o:list){

System.out.println(o);

}

}

//<? super Number> 只允许泛型为Number及Number父类引用调用

public static void print5(List<? super Number> list){

for(Object o:list){

System.out.println(o);

}

}

/*方法参数中<? extends Number&Comparable>这种修饰符是不支持的

public static void print6(List<? extends Number & Comparable> list){

for(Object o:list){

System.out.println(o);

}

}

*/

/**

* 泛型的通配符(用于泛型方法)

* 定义:修饰符 泛型 返回类型 方法名 参数列表 抛出的异常

* 语法:<T>、T可以是任意字母,但通常必须要大写(常用字母T)。<T>通常需放在方法的返回值声明之前。

* 1、<T> 允许所有泛型的引用调用

* 2、<T extends Number> 只允许泛型为Number及Number类型的子类引用调用

* 3、<T extends Comparable> 只允许泛型为实现了Comparable接口的实现类的引用调用

* 4、<T extends Number&Comparable>只允许泛型为既是Number及Number子类 又实现了Comparable接口的实现类的引用调用

* 注意:

* 泛型方法中<? super Number>这种修饰符是不支持的

*/

@Test public void TestGenerics3(){

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

List<Object> l2 = new ArrayList<Object>();

List<Number> l3 = new ArrayList<Number>();

List<Integer> l4 = new ArrayList<Integer>();

List<Double> l5 = new ArrayList<Double>();

String[] a1 = new String[10];

Object[] a2 = new Object[10];

Number[] a3 = new Number[10];

Integer[] a4 = new Integer[10];

Double[] a5 = new Double[10];

copyFromArray(l1,a1);

copyFromArray(l2,a2);

copyFromArray(l3,a3);

copyFromArray(l4,a4);

copyFromArray(l5,a5);

}

public static<T> void copyFromArray(List<T> l,T[] a){

for(T o : a){

l.add(o);

}

}

// <T extends Number> 只允许泛型为Number及Number子类的引用调用

public static <T extends Number > void copyFromArray1(List<T> l,T[] a){

for(T o:a){

l.add(o);

}

}

/* 此处不许用super

public static <T super Number> void copyFromArray2(List<T> l,T[] a){

for(T o:a){

l.add(o);

}

}

*/

}


/**

 * 注意: 只有对象类型才能作为泛型方法的实际参数

 * 在泛型中可以同时有多个类型,

 */

分享到:
评论

相关推荐

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....

    java笔记.zip

    尚硅谷康师傅java学习笔记。 、2020-4-5 java学习笔记 2020-4-6 java笔记 ---内部类 2020-4-6 java笔记 ---异常 2020-4-6 java笔记 --多线程 2020-4-8 java笔记 String类 2020-4-9 java 比较器 2020-4-10 java笔记 ...

    Java泛型,深入学习java的不二之选.md

    java泛型详细学习,深入学习java的不二之选

    泛型笔记学习2009

    在Java泛型出现之前,集合框架中的类如`List`、`Map`等都是以`Object`作为类型处理元素的。这意味着在使用这些集合时,往往需要频繁地进行类型转换操作,如: ```java List list = new ArrayList(); list.add("hello...

    Java泛型学习笔记.pdf

    学习Java泛型能够帮助我们更好地编写和使用通用的类、接口和方法。以下是从给定文件的标题、描述、标签和部分内容中提取出的详细知识点。 1. 泛型类和泛型方法: 在Java中,泛型可以应用于类、接口和方法。泛型类和...

    Exer.java(JavaSE泛型学习笔记)

    泛型学习笔记2的源代码,泛型 : 要解决类型的安全问题, 如果使用Object类型会带来类型的损失。典型的应用就是在集合中, 集合中理论上可以保存任意对象,实际上我们应该让它泛型化,集合类&lt;元素类型&gt;, 添加元素...

    Java1.5泛型指南中文版(Java1.5Gene....pdf

    本资源为 Java 1.5 泛型指南中文版的详细笔记,涵盖了泛型的基础知识、泛型类、泛型方法、通配符、擦除和翻译、类型安全、类型参数、实际类型参数、擦除、翻译、转型和 instanceof、数组、Class Literals as Run-...

    基于Java的源码-java多线程反射泛型及正则表达式学习笔记和源码.zip

    在这个压缩包中,你将找到与这些主题相关的学习笔记和源码示例。通过深入研究这些代码,你可以更深入地理解如何在实际项目中应用多线程、反射、泛型和正则表达式。同时,实践是掌握技术的关键,因此,尝试修改和扩展...

    JAVA学习笔记-java学习笔记WORD样式.docx

    ### JAVA学习笔记知识点详解 #### 一、计算机概述 1. **计算机**:电子设备,用于处理信息。 2. **计算机硬件**: - **中央处理器(CPU)**:计算机的大脑,负责处理指令。 - **内存(RAM)**:临时存储数据,...

    基于Java的源码-多线程反射泛型及正则表达式学习笔记和源码.zip

    《深入理解Java多线程、反射、泛型与正则表达式》 在Java编程领域,多线程、反射、泛型以及正则表达式是四个至关重要的概念,它们为开发者提供了强大的工具,使得程序更加高效、灵活且可维护。这份学习资料包括了...

    java基础学习笔记之泛型

    泛型是Java编程语言中的一个重要特性,首次在JDK 1.5版本中引入,它允许程序员在定义类、接口和方法时使用类型参数,从而实现了类型的安全性和代码的复用性。...理解和熟练使用泛型是Java开发者必备的技能之一。

    Java基础尚硅谷宋红康学习笔记

    【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性...通过深入学习和实践,你可以不断提升自己的Java编程能力。

    高质量JAVA程序设计-个人学习笔记

    这份“高质量JAVA程序设计-个人学习笔记”涵盖了Java编程中的关键知识点,旨在帮助学习者提升代码质量,更好地理解和实践良好的编程习惯。 1. **面向对象编程**:Java是一种纯面向对象的语言,理解类、对象、封装、...

    Java基础 学习笔记 Markdownr版

    本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...

    Java 基础-尚硅谷学习笔记(含面试题) 2023年

    本资料“Java 基础-尚硅谷学习笔记(含面试题)2023年”旨在提供全面的Java基础知识,并结合最新的面试趋势,帮助学习者巩固基础并为面试做好准备。 1. **Java语法基础** - **变量与数据类型**:Java支持基本数据...

    java学习笔记-----给java初学者

    Java学习笔记是专门为Java初学者设计的一套详尽的学习资源,旨在帮助新手快速掌握这门广泛使用的编程语言。这份笔记涵盖了从基础概念到高级特性的全面内容,是学习和复习Java知识的理想工具。 1. **Java简介** ...

    JAVA学习笔试(数据基础+泛型编程)-适合小白

    JAVA学习是每位初学者步入编程...以上就是JAVA学习笔记的主要内容,对于非计算机专业的人来说,逐步理解并实践这些知识点将有助于建立起坚实的JAVA编程基础。在学习过程中,不断练习和实际应用是巩固知识的最好方式。

    基于java的开发源码-多线程反射泛型及正则表达式学习笔记和源码.zip

    在"基于java的开发源码-多线程反射泛型及正则表达式学习笔记和源码.zip"这个压缩包中,包含了三个关键的Java编程概念:多线程、反射和泛型,以及正则表达式。下面我们将详细探讨这些知识点。 1. **多线程**:多线程...

Global site tag (gtag.js) - Google Analytics