泛型是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)是JDK5引入的一种参数化类型特性。它提供了编译时类型安全检测机制。其本质是参数类型,所操控的数据类型被指定为一个参数。泛型不存在于JVM虚拟机。泛型学习、泛型限定类型、泛型通配符、泛型继承。...
环境:Windows XP Professional、JDK 1.6、Ant 1.7 说明:Java泛型的动机是为解决类型转换在编译时不报错的问题。另外由于“范型编程”(Generic Programming)的推广,于是2004年JDK 5.0引用范型标准。本例子说明...
本资料 "[Java泛型和集合].(Java.Generics.and.Collections).Maurice.Naftalin&Philip.Wadler.文字版" 由知名专家Maurice Naftalin和Philip Wadler编著,提供了关于这些主题的深入理解。 **Java泛型** 是自Java...
通过阅读"Java Generics and Collections",开发者不仅可以掌握Java泛型和集合的基本使用,还能深入了解它们的高级特性和最佳实践,从而在实际项目中编写出更高质量的代码。这本书对于Java程序员来说是一份宝贵的...
这本书深入探讨了.NET 2.0中的泛型特性,对于希望提升.NET编程技能的开发者来说是一份宝贵的资源。通过学习,开发者可以更好地理解如何利用泛型来创建高效、类型安全且可复用的代码,从而提高软件的质量和维护性。
- 类如 `class Java_Generics,V>`,`K` 和 `V` 就是类型参数,类似于函数中的变量,它们在实例化时会被具体的类型替换。 - 示例中,`TestGen0, String>` 就是泛型类的具体实例,其中 `K` 被替换为 `String`,`V` ...
这个“Java-Custom-Generics:在 Java 中使用自定义泛型的简单示例”很可能是为了展示如何在实际编程中应用泛型。 泛型的引入旨在提高代码的类型安全性,减少运行时的类型检查和强制转换,同时提升代码的可读性和...
JDK 1.5的泛型實現(Generics in JDK 1.5) 1 侯捷觀點 JDK 1.5的泛型實現 — Generics in JDK 1.5 — 北京《程序員》 2004/09 台北《Run!PC》2004/09 作者簡介:侯捷,資訊教育、專欄執筆、大學教師...
Java 1.5引入了泛型(Generics)的概念,这是一个重要的语言特性,它允许开发者在编译时期指定集合或其他数据结构中的元素类型,从而避免了运行时期的类型转换错误。通过使用泛型,开发者可以在编程阶段就确保类型的...
在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...
在Java编程语言中,泛型(Generics)和方法是两个重要的概念,它们极大地提高了代码的类型安全性和可重用性。这篇博文将探讨这两个主题,并结合源码和工具进行深入解析。 首先,泛型是Java 5引入的一项重要特性,它...
泛型(Generics)是一种在编程中引入的模板机制,用于在定义数据结构或方法时创建类型参数。这些参数可以在实例化时替换为具体的类型,使得容器(如List、Set、Map等)能够存储特定类型的元素,而不是任意类型。...
Java泛型(Generics)是一种在编译时确保类型安全的机制,它允许程序员编写类型安全的通用类或方法,而无需进行显式的类型转换。在Java 1.5引入泛型之前,集合类(如`ArrayList`)只能存储`Object`类型的元素。这...
泛型是TypeScript中的一个重要特性,它允许我们在编写代码时定义通用的类型,从而提高代码的可重用性和类型安全性。在大型系统开发中,泛型的使用是至关重要的,因为它们确保组件不仅可以处理当前的数据类型,还能...
泛型(Generics)是指在面向对象编程中,通过参数化类型来达到类型重用的目的。通俗地说,就是将类或方法中的某些类型定义为参数形式,在实际使用时再传入具体类型的机制。 ##### 2.2 为什么使用泛型? 1. **类型...
System.Collections.Generics命名空间包含了多种泛型集合,如List、Dictionary,TValue>等。使用泛型集合,开发者可以在保持类型安全的同时,享受到高效的数据操作。例如,例2展示了如何创建一个只接受int类型的List...
根据提供的文件信息,我们可以确定本书的标题为《Java泛型和集合》(Java Generics and Collections),作者为Maurice Naftalin和Philip Wadler。该书详细介绍了Java中的泛型(Generics)特性以及集合(Collections...