`
wxq594808632
  • 浏览: 262444 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

泛型(Generics)简说

    博客分类:
  • java
阅读更多
泛型是JDK1.5中一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小地抛出ClassCastException的可能。个人认为泛型就是你在存入的时候指定类型.在取出的时候不用进行类型转换.存什么取什么.
http://www.ibm.com/developerworks/cn/java/j-lo-gj/

泛型详解


没有泛型之前
package com.smallq.jdk5;

public class ObjectFoo {
	private Object foo;

	public Object getFoo() {
		return foo;
	}

	public void setFoo(Object foo) {
		this.foo = foo;
	}

	public static void main(String[] args) {
		ObjectFoo foo1 = new ObjectFoo();
		foo1.setFoo(new Boolean(true));
		
		String b=(String)foo1.getFoo();
		System.out.println(b);
	}
}



程序会抛出一个类型转换的异常

Exception in thread "main" java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
	at com.smallq.jdk5.ObjectFoo.main(ObjectFoo.java:18)


编译器不会提醒你程序有问题.但其实程序运行的时候会出错


有泛型之后

package com.smallq.jdk5;

public class GenericFoo<T> {
	private T foo;

	public T getFoo() {
		return foo;
	}

	public void setFoo(T foo) {
		this.foo = foo;
	}

	public static void main(String[] args) {
		GenericFoo<Boolean> foo1 = new GenericFoo<Boolean>();
		foo1.setFoo(new Boolean(true));

		Boolean b =  foo1.getFoo();
		System.out.println(b);
	}
}




如果foo1的set方法set的是一个string的话.就会出现编译时错误.减少了类型转换异常的发生



泛型的其他特点


package com.smallq.jdk5;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class GenericTest<T> {
	private T foo;

	public T getFoo() {
		return foo;
	}

	public void setFoo(T foo) {
		this.foo = foo;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 简单的说,实例化类型持有者时,它必須是实现List的类别或其子类别
		// 要定义这样一个名称,您可以使用 ‘?’通配字元
		// 并使用“extends”关键字限定类型持有者的型态
		GenericTest<? extends List> foo1 = null;
		foo1 = new GenericTest<ArrayList>();
		foo1 = new GenericTest<LinkedList>();

		// 实现类必须是指定类的父类
		GenericTest<? super ArrayList> foo2 = null;
		foo2 = new GenericTest<List>();

		GenericTest<String> foo3 = new GenericTest<String>();
		foo3.setFoo("hello world");

		GenericTest<?> foo4 = null;
		foo4 = foo3;

		System.out.println(foo4.getFoo());

		foo4.setFoo(null);
		// 使用<?>或是<? extends SomeClass>的声明方式
		// 意味著您只能通过该名称來取得所参考实例的信息,或者是移除某些信息,但
		// 不能增加它的信息,因为只知道当中放置的是SomeClass的子类,但不确定是
		// 什么类的实例,编译器不让您加入信息,理由是,如果可以加入信息的話,那么
		// 您就得記得取回的实例是什么类型,然后转换为原來的类型方可进行操作,
		// 这就失去了使用泛型的意义。
		// 所以下面这句不可以
		// foo4.setFoo("abc");
		System.out.println(foo4.getFoo());

	}
}


package com.smallq.jdk5;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * 通过extends关键字指定T的类型必须是list的子类或者实现类
 * @author smallq
 *
 * @param <T>
 */
public class ListGenericFoo<T extends List> {
	private T[] fooArray;

	public T[] getFooArray() {
		return fooArray;
	}

	public void setFooArray(T[] fooArray) {
		this.fooArray = fooArray;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ListGenericFoo<LinkedList> foo1 = new ListGenericFoo<LinkedList>();
		ListGenericFoo<ArrayList> foo2 = new ListGenericFoo<ArrayList>();
		LinkedList[] linkedList = new LinkedList[10];
		ArrayList[] arrayList = new ArrayList[10];
		
		foo1.setFooArray(linkedList);
		foo2.setFooArray(arrayList);
		
		
		ListGenericFoo<? extends List> foo3=null;
		foo3=new ListGenericFoo<ArrayList>();
		foo3=new ListGenericFoo<LinkedList>();
		//下面这句就不可以.因为他没有实现List接口
		//ListGenericFoo<HashMap> f=new ListGenericFoo<HashMap>();
	}

}


分享到:
评论

相关推荐

    泛型generics.zip

    泛型(Generics)是JDK5引入的一种参数化类型特性。它提供了编译时类型安全检测机制。其本质是参数类型,所操控的数据类型被指定为一个参数。泛型不存在于JVM虚拟机。泛型学习、泛型限定类型、泛型通配符、泛型继承。...

    Java 泛型(Generics)使用说明

    环境:Windows XP Professional、JDK 1.6、Ant 1.7 说明:Java泛型的动机是为解决类型转换在编译时不报错的问题。另外由于“范型编程”(Generic Programming)的推广,于是2004年JDK 5.0引用范型标准。本例子说明...

    [Java泛型和集合].(Java.Generics.and.Collections).文字版

    本资料 "[Java泛型和集合].(Java.Generics.and.Collections).Maurice.Naftalin&amp;Philip.Wadler.文字版" 由知名专家Maurice Naftalin和Philip Wadler编著,提供了关于这些主题的深入理解。 **Java泛型** 是自Java...

    Java Generics and Collections (Java泛型与集合)

    通过阅读"Java Generics and Collections",开发者不仅可以掌握Java泛型和集合的基本使用,还能深入了解它们的高级特性和最佳实践,从而在实际项目中编写出更高质量的代码。这本书对于Java程序员来说是一份宝贵的...

    .Net 2.0 泛型高级编程(Professional .NET 2.0 Generics )

    这本书深入探讨了.NET 2.0中的泛型特性,对于希望提升.NET编程技能的开发者来说是一份宝贵的资源。通过学习,开发者可以更好地理解如何利用泛型来创建高效、类型安全且可复用的代码,从而提高软件的质量和维护性。

    泛型java的泛型知识,非常有用

    - 类如 `class Java_Generics,V&gt;`,`K` 和 `V` 就是类型参数,类似于函数中的变量,它们在实例化时会被具体的类型替换。 - 示例中,`TestGen0, String&gt;` 就是泛型类的具体实例,其中 `K` 被替换为 `String`,`V` ...

    Java-Custom-Generics:在 Java 中使用自定义泛型的简单示例

    这个“Java-Custom-Generics:在 Java 中使用自定义泛型的简单示例”很可能是为了展示如何在实际编程中应用泛型。 泛型的引入旨在提高代码的类型安全性,减少运行时的类型检查和强制转换,同时提升代码的可读性和...

    JDK 1.5的泛型實現(Generics in JDK 1.5)

    JDK 1.5的泛型實現(Generics in JDK 1.5) 1 侯捷觀點 JDK 1.5的泛型實現 — Generics in JDK 1.5 — 北京《程序員》 2004/09 台北《Run!PC》2004/09 作者簡介:侯捷,資訊教育、專欄執筆、大學教師...

    Java1.5泛型指南中文版

    Java 1.5引入了泛型(Generics)的概念,这是一个重要的语言特性,它允许开发者在编译时期指定集合或其他数据结构中的元素类型,从而避免了运行时期的类型转换错误。通过使用泛型,开发者可以在编程阶段就确保类型的...

    java 泛型类的类型识别示例

    在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...

    泛型和方法

    在Java编程语言中,泛型(Generics)和方法是两个重要的概念,它们极大地提高了代码的类型安全性和可重用性。这篇博文将探讨这两个主题,并结合源码和工具进行深入解析。 首先,泛型是Java 5引入的一项重要特性,它...

    泛型编程小实例(以List为例)

    泛型(Generics)是一种在编程中引入的模板机制,用于在定义数据结构或方法时创建类型参数。这些参数可以在实例化时替换为具体的类型,使得容器(如List、Set、Map等)能够存储特定类型的元素,而不是任意类型。...

    面试必须资料java泛型攻略、

    Java泛型(Generics)是一种在编译时确保类型安全的机制,它允许程序员编写类型安全的通用类或方法,而无需进行显式的类型转换。在Java 1.5引入泛型之前,集合类(如`ArrayList`)只能存储`Object`类型的元素。这...

    6-generics(泛型6).pdf

    泛型是TypeScript中的一个重要特性,它允许我们在编写代码时定义通用的类型,从而提高代码的可重用性和类型安全性。在大型系统开发中,泛型的使用是至关重要的,因为它们确保组件不仅可以处理当前的数据类型,还能...

    java 泛型的使用 详细讲解

    泛型(Generics)是指在面向对象编程中,通过参数化类型来达到类型重用的目的。通俗地说,就是将类或方法中的某些类型定义为参数形式,在实际使用时再传入具体类型的机制。 ##### 2.2 为什么使用泛型? 1. **类型...

    深入浅出.NET泛型编程

    System.Collections.Generics命名空间包含了多种泛型集合,如List、Dictionary,TValue&gt;等。使用泛型集合,开发者可以在保持类型安全的同时,享受到高效的数据操作。例如,例2展示了如何创建一个只接受int类型的List...

    Java泛型和集合-英文版

    根据提供的文件信息,我们可以确定本书的标题为《Java泛型和集合》(Java Generics and Collections),作者为Maurice Naftalin和Philip Wadler。该书详细介绍了Java中的泛型(Generics)特性以及集合(Collections...

Global site tag (gtag.js) - Google Analytics