`
jiabao523527
  • 浏览: 8058 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
社区版块
存档分类
最新评论

黑马程序员_泛型之初体验

 
阅读更多

  ------- android培训java培训、期待与您交流! ----------

 

1. 什么是泛型?
泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。可以在集合框架(Collection framework)中看到泛型的动机。泛型最大的优点就是消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中,同时提高Java 程序的类型安全,增强程序的可靠性!

2.泛型基础

2.1类型参数
定义泛型类或声明泛型类的变量时,使用尖括号来指定形式类型参数。

public class GenericsDemo14{  
   public static void main(String args[]){  
       Info<String> i = new Info<String>() ;       // 使用String为泛型类型  
        i.setVar("it") ;                            // 设置内容  
       fun(i) ;  
   }  

2.2命名类型参数
推荐的命名约定是使用大写的单个字母名称作为类型参数

推荐的名称是:
K —— 键,比如映射的键。
V —— 值,比如 List 和 Set 的内容,或者 Map 中的值。
 E —— 异常类。
T —— 泛型。

class Notepad<K,V>{       // 此处指定了两个泛型类型  
    private K key ;     // 此变量的类型由外部决定  
    private V value ;   // 此变量的类型由外部决定  
    public K getKey(){  
        return this.key ;  
    }  
   public V getValue(){  
        return this.value ;  
   }  
   public void setKey(K key){  
        this.key = key ;  
    }  
    public void setValue(V value){  
        this.value = value ;  
   }  
} 

2.3类型通配符

引入了类型通配符,可以声明 List<?> 类型的变量。

假设您具有该方法:

void printList(List l) {
for (Object o : l)
System.out.println(o);
}

 
上面的代码在 JDK 5.0 上编译通过,但是如果试图用 List<Integer> 调用它,则会得到警告。出现警告是因为,您将泛型(List<Integer>)传递给一个只承诺将它当作 List(所谓的原始类型)的方法,这将破坏使用泛型的类型安全。
如果试图编写像下面这样的方法,那么将会怎么样?

void printList(List<Object> l) {
for (Object o : l)
System.out.println(o);
}

 它仍然不会通过编译,因为一个 List<Integer> 不是 一个 List<Object>。这才真正烦人 —— 现在您的泛型版本还没有普通的非泛型版本有用!
解决方案是使用类型通配符:

void printList(List<?> l) {
for (Object o : l)
System.out.println(o);
}

上面代码中的问号是一个类型通配符。它读作“问号”。List<?> 是任何泛型 List 的父类型,所以您完全可以将 List<Object>、List<Integer> 或 List<List<List<Flutzpah>>> 传递给 printList()。

2.4 泛型方法
在类的定义中添加一个形式类型参数列表,可以将类泛型化。方法也可以被泛型化,不管它们定义在其中的类是不是泛型化的。

class Demo{
	public <T> T fun(T t){	 // 可以接收任意类型的数据
		return t ;	 // 直接把参数返回
         }
  }
-------------------------------------------------------------------------------------
/*泛型方法不一定要通过参数来确定泛型准确类型,可以只通过返回值*/
public static  ArrayList<E> newArrayList() {
    return new ArrayList<E>();
  }
    public List<PrepaidHistory> queryHistories(Long skyid,PrepaidHistoryType type, Date from, Date end) {

    。。。
        return Lists.newArrayList();//智能的知道返回类型为repaidHistory
    }

2.5有限制类型

可以对类型进行限定:
 ? extends E:接收E类型或者E的子类型对象。上限!
? super E :接收E类型或者E的父类型。下限!

class Info<T extends Number>{	// 指定上限,只能是数字类型
	private T var ;		// 此类型由外部决定
	public T getVar(){
		return this.var ;	
	}
	public void setVar(T var){
		this.var = var ;
	}
	public String toString(){	// 覆写Object类中的toString()方法
		return this.var.toString() ;	
	}
}
public class GenericsDemo27{
		public static <T extends Number> Info<T> fun(T param){//方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定
		Info<T> temp = new Info<T>() ;		// 根据传入的数据类型实例化Info
		temp.setVar(param) ;		// 将传递的内容设置到Info对象的var属性之中
		return temp ;	// 返回实例化对象
	}
}
public static void printCollection(Collection<? super Student> al){

		Iterator<? super Student> it = al.iterator();
		//接受student类型或它的父类型。
		while(it.hasNext()){
			
			System.out.println(it.next());
		}
	}

 

 2.6泛型数组

public class GenericsDemo30{
	public static void main(String args[]){
		Integer i[] = fun1(1,2,3,4,5,6) ;	// 返回泛型数组
		fun2(i) ;
	}
	public static <T> T[] fun1(T...arg){	// 接收可变参数
		return arg ;		// 返回泛型数组
	}
	public static <T> void fun2(T param[]){	// 输出
		System.out.print("接收泛型数组:") ;
		for(T t:param){
			System.out.print(t + "、") ;
		}
	}
}

 

分享到:
评论

相关推荐

    黑马程序员_Java基础辅导班教程课件[第01期]第13天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第13天"中,我们聚焦于Java编程语言的基础知识,这是一门面向初学者的课程,旨在帮助学员快速掌握Java开发的基本技能。第13天的课程通常会涵盖上一天(第12天)所学...

    jdk5.zip_java 泛型_jdk5 泛型_泛型

    泛型允许程序员在类、接口和方法中使用类型参数,使得容器(如ArrayList、LinkedList等)可以保存特定类型的元素,避免了强制类型转换的麻烦,并且在编译阶段就能发现可能的类型错误。 1. **泛型的基本概念**: - ...

    Cpp设计新思维_泛型编程与设计模式之应用

    《Cpp设计新思维_泛型编程与设计模式之应用》这本书深入探讨了C++编程中的泛型编程和设计模式的应用,对于提升C++开发者的技术水平具有极高的价值。以下是本书涉及的一些关键知识点: 1. 泛型编程:泛型编程是C++中...

    C__泛型的运用

    ### C# 泛型的应用详解 #### 一、泛型的概念 在C#中,泛型是一种能够编写灵活且类型安全代码的强大工具。通过使用泛型,开发人员可以在不牺牲性能的情况下实现代码重用。简单来说,泛型允许开发者创建可以处理多种...

    T21.13_泛型DAO模式与OSIV java 经典教程 经典教材

    T21.13_泛型DAO模式与OSIV java 经典教程 经典教材

    fanxing.rar_泛型

    在C#编程语言中,泛型是一种强大的特性,它允许我们编写可重用的代码,同时保持类型安全和性能。"fanxing.rar_泛型"这个压缩包文件可能包含了一系列关于C#泛型的练习,旨在帮助学习者深入理解和熟练运用泛型。现在,...

    C_泛型集合

    【C# 泛型集合详解】 C# 泛型集合是面向对象编程(OOP)中的一个重要特性,尤其是在C#语言中,它极大地提升了代码的效率和安全性。在C# 2.0版本引入泛型之后,开发人员可以更加方便地创建和管理强类型的数据集合,...

    Java_5_Tiger.rar_Tiger_泛型

    1. **泛型**:泛型是Java 5引入的最重要的特性之一,它允许在类、接口和方法中使用类型参数,从而实现了类型安全的集合操作。泛型的主要优点是避免了类型转换的麻烦,消除了运行时的类型异常。例如,ArrayList可以...

    SpringIOC_泛型依赖注入.zip

    本资料包"SpringIOC_泛型依赖注入.zip"主要关注的是Spring如何通过泛型进行依赖注入,这是一种更加灵活且类型安全的注入方式。 在Java编程中,泛型是一种强大的特性,允许我们在类、接口和方法中使用类型参数,从而...

    MyGeneric_amounttv7_泛型专题_

    泛型是Java编程语言中的一个强大特性,它允许在定义类、接口和方法时使用类型参数,从而提高代码的重用性、安全性和效率。在本文中,我们将深入探讨泛型的声明、使用、特点、约束、方法以及泛型类和泛型缓存。 首先...

    GP-泛型算法通则.rar_GP算法_gp_泛型

    《GP-泛型算法通则》是一份深入探讨GP(Genetic Programming)算法与泛型编程相结合的资源包。GP算法是一种基于生物进化原理的计算方法,它模仿自然选择和遗传过程来解决复杂问题,而泛型编程是编程语言中的一种技术...

    MyGeneric_sadb3t_carryfz8_泛型的使用进阶_

    在IT行业中,泛型是Java、C#等编程语言中的一种强大的特性,它允许程序员在定义数据结构或方法时引入类型参数,以提高代码的复用性和安全性。本篇文章将深入探讨“泛型的使用进阶”,包括泛型缓存、泛型类、泛型方法...

    Week17_第9讲_泛型与集合类.pdf

    - **定义**:泛型是Java SE 5.0引入的新特性,它允许程序员在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。 - **作用**: - 消除强制类型转换。 - 在编译期进行类型检查,减少...

    JAVAfanxing.rar_泛型

    Java 泛型是Java语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。泛型允许我们在编程时指定容器(如集合)所存储的数据类型,从而在编译阶段就能捕获类型错误,而...

    黑马程序员Javase笔记

    Java是世界上最流行的编程语言之一,尤其在...总结来说,"黑马程序员Javase笔记"涵盖了Java的基础语法、内存管理、面向对象编程、集合框架以及泛型和Map等内容,这些都是成为一名合格Java开发者必须掌握的核心知识。

    黑马程序员匠心之作 C++教程_第7阶段-C++实战项目机房预约讲义.rar

    《黑马程序员匠心之作 C++教程_第7阶段-C++实战项目机房预约讲义》是为C++初学者量身定制的一份详细教学资源。这份讲义深入浅出地介绍了C++编程语言,并通过实际的机房预约系统项目,帮助学习者将理论知识与实践相...

    里氏替换原则+排序_接口_泛型比较器+序列化+泛型集合.rar

    简单介绍 里氏替换原则 简单工程模式 实现任意排序 使用了 is 和 as 方法 ArrayList数组 与 List泛型集合 Hashtable数组 与 Dictionary,v&gt;泛型集合 的基本使用 序列化 将数据存储

Global site tag (gtag.js) - Google Analytics