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多线程反射泛型及正则表达式学习笔记和源码....
尚硅谷康师傅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的不二之选
在Java泛型出现之前,集合框架中的类如`List`、`Map`等都是以`Object`作为类型处理元素的。这意味着在使用这些集合时,往往需要频繁地进行类型转换操作,如: ```java List list = new ArrayList(); list.add("hello...
学习Java泛型能够帮助我们更好地编写和使用通用的类、接口和方法。以下是从给定文件的标题、描述、标签和部分内容中提取出的详细知识点。 1. 泛型类和泛型方法: 在Java中,泛型可以应用于类、接口和方法。泛型类和...
泛型学习笔记2的源代码,泛型 : 要解决类型的安全问题, 如果使用Object类型会带来类型的损失。典型的应用就是在集合中, 集合中理论上可以保存任意对象,实际上我们应该让它泛型化,集合类<元素类型>, 添加元素...
本资源为 Java 1.5 泛型指南中文版的详细笔记,涵盖了泛型的基础知识、泛型类、泛型方法、通配符、擦除和翻译、类型安全、类型参数、实际类型参数、擦除、翻译、转型和 instanceof、数组、Class Literals as Run-...
在这个压缩包中,你将找到与这些主题相关的学习笔记和源码示例。通过深入研究这些代码,你可以更深入地理解如何在实际项目中应用多线程、反射、泛型和正则表达式。同时,实践是掌握技术的关键,因此,尝试修改和扩展...
### JAVA学习笔记知识点详解 #### 一、计算机概述 1. **计算机**:电子设备,用于处理信息。 2. **计算机硬件**: - **中央处理器(CPU)**:计算机的大脑,负责处理指令。 - **内存(RAM)**:临时存储数据,...
《深入理解Java多线程、反射、泛型与正则表达式》 在Java编程领域,多线程、反射、泛型以及正则表达式是四个至关重要的概念,它们为开发者提供了强大的工具,使得程序更加高效、灵活且可维护。这份学习资料包括了...
泛型是Java编程语言中的一个重要特性,首次在JDK 1.5版本中引入,它允许程序员在定义类、接口和方法时使用类型参数,从而实现了类型的安全性和代码的复用性。...理解和熟练使用泛型是Java开发者必备的技能之一。
【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性...通过深入学习和实践,你可以不断提升自己的Java编程能力。
这份“高质量JAVA程序设计-个人学习笔记”涵盖了Java编程中的关键知识点,旨在帮助学习者提升代码质量,更好地理解和实践良好的编程习惯。 1. **面向对象编程**:Java是一种纯面向对象的语言,理解类、对象、封装、...
本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...
本资料“Java 基础-尚硅谷学习笔记(含面试题)2023年”旨在提供全面的Java基础知识,并结合最新的面试趋势,帮助学习者巩固基础并为面试做好准备。 1. **Java语法基础** - **变量与数据类型**:Java支持基本数据...
Java学习笔记是专门为Java初学者设计的一套详尽的学习资源,旨在帮助新手快速掌握这门广泛使用的编程语言。这份笔记涵盖了从基础概念到高级特性的全面内容,是学习和复习Java知识的理想工具。 1. **Java简介** ...
JAVA学习是每位初学者步入编程...以上就是JAVA学习笔记的主要内容,对于非计算机专业的人来说,逐步理解并实践这些知识点将有助于建立起坚实的JAVA编程基础。在学习过程中,不断练习和实际应用是巩固知识的最好方式。
在"基于java的开发源码-多线程反射泛型及正则表达式学习笔记和源码.zip"这个压缩包中,包含了三个关键的Java编程概念:多线程、反射和泛型,以及正则表达式。下面我们将详细探讨这些知识点。 1. **多线程**:多线程...