一)泛型的作用
相对于依赖程序员来记住对象类型、执行类型转换——这会导致
程序运行时才发现错误,很难调试和解决。 泛型的主要好处就是让编译器保留参数的类型信息,执行类型检查,执行类型转换操作:
编译器保证了这些类型转换的绝对无误。而编译器能够帮助程序员在编译时强制进行大量的类型检查,发现其中的错误。并且Java泛型是一种便捷语法,能节省你某些Java类型转换(casting)上的操作。
二)泛型的声明
泛型的声明可细分为四种: 泛型类声明,泛型接口声明,泛型方法声明,泛型构造器声明
1)
泛型类和接口声明
两者非常类似:
public class GenericsFoo<T> { ...}
public interface GenericsIFoo<T> { ...}
public interface List<T> extends Collection<T> { ...}
声明完以后,在该类/接口里就可使用泛型标记如下:
T get(int index);
2)
泛型方法和构造器的声明
public static <T> T getFirst(List<T> list) { ...}
<X> GenericsFoo(X x) {...}
3)
实例:
class MyClass<X> {
<T> MyClass(T t) { }
}
public class Test{
public static void main(String args[]){
Integer i = 0;
MyClass<String> mc = new MyClass<String>(i);
}
}
三)限制类型和通配符
1)
限制类型
如果有类声明限制类型如下:
public class CollectionGenFoo<T extends Collection> {...}
那么:
//正确:
CollectionGenFoo<ArrayList> listFoo = null;
listFoo = new CollectionGenFoo<ArrayList>(new ArrayList());
//出错了,不让这么干。
CollectionGenFoo<Collection> listFoo = null;
listFoo=new CollectionGenFoo<ArrayList>(new ArrayList());
这个故事告诉我们两点:
1' 泛型中CollectionGenFoo<A>与CollectionGenFoo<B>没有任何继承,父子或相等的关系,无论A和B是什么关系
2' <T extends Collection>限定的是T类型是实现Collection接口的类型,或者T是继承了XX类的类型。
2)
通配符
<?> 允许Object及其下的任何Java类。也就是任意类。看似有点多余,但记住哦A<?>和A<T>永远不等啊!这很有用
<? extends T> 向下限制,只接受T及其子类。一下是个例子:
//现在不会出错了
CollectionGenFoo<? extends Collection> listFoo1 = null;
listFoo=new CollectionGenFoo<ArrayList>(new ArrayList());
<? super T> 向上限制,只接受T及其父类。
四)注意事项
1) PECS法则,”Producer Extends, Consumer Super”,不细说了,详见《effective java》
2) 一个static方法,无法访问泛型类的类型参数,所以,若要static方法需要使用泛型能力,
必须使其成为泛型方法。
3) 一个不错的例子
声明:
public static <E> Set<E> union(Set<? extends E> s1, Set<? extends E> s2)
错误的使用,报错,因为E无法确定,需显示指明:
Set<Integer> integers = ...;
Set<Double> doubles = ...;
Set<Number> numbers = union(intergers,doubles);
正确的写法:
Set<Number> numbers = Union.<Number>union(integers,doubles);
分享到:
相关推荐
本书"Java Generics and Collections"深入探讨了这两个主题,帮助开发者编写更安全、更高效且可维护的代码。 首先,让我们来理解Java泛型。泛型是Java 5引入的一项特性,它允许在类、接口和方法中使用类型参数。这...
《Java Generics and Collections》是Java开发者必备的参考资料,它深入探讨了Java编程中的泛型(Generics)和集合(Collections)这两个核心概念。在Java编程中,泛型和集合框架是提高代码效率、可读性和类型安全性...
Java泛型(Generics)是Java SE 5.0引入的一种新特性,它允许程序员在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。下面将根据给定的文件信息,深入解析Java泛型的一些核心知识点...
Java泛型速查表 Java泛型是Java编程语言中的一个重要特性,它允许在编译时提供类型的安全性检查,减少类型转换的需要,并允许程序员在创建集合和其他类型的数据结构时不用指定具体的类型。泛型能够支持类型之间的...
### Java Generics FAQ:基础知识详解 #### 一、概述与组织结构 《Java Generics FAQ》是一份由Angelika Langer编写并维护的文档,详细介绍了Java泛型的基础知识及其应用。该文档最初发布于2004年,并在之后不断...
本资料 "[Java泛型和集合].(Java.Generics.and.Collections).Maurice.Naftalin&Philip.Wadler.文字版" 由知名专家Maurice Naftalin和Philip Wadler编著,提供了关于这些主题的深入理解。 **Java泛型** 是自Java...
泛型与集合 使用 进行初步翻译. 将利用碎片时间进行整理和校对,完整的时间段适合做其他需要大量思考的事,如果你有兴趣欢迎提交PR。 TODO 数据校对 目录 2.4 获取和放置原则 2.5 数组 2.6 通配符与类型参数 ...
### Java泛型教程详解 #### 引言:Java泛型简介 Java的泛型是Java 1.5引入的一项重要特性,它允许开发者在类型上进行抽象,从而编写出更加通用且类型安全的代码。本教程旨在深入浅出地介绍Java泛型的基本概念和...
#### Java Generics:常见问题解答 ##### 关于本FAQ 这份文档是由Angelika Langer撰写并维护的关于Java类属机制(Java Generics)的常见问题解答。该文档最初发布于2004年,并在2006年进行了更新。以下是根据提供...
JavaGenerics, String> test = new JavaGenerics(); test.put("key", "value"); String s = test.get("key"); System.out.println(s); // 输出: value } ``` 在这个例子中,`JavaGenerics` 类有两个类型参数 `K...
在有关Java核心的系列文章中,我们将继续学习2个新内容,即Generics和Collection,它们是Java中非常流行的对象。 泛型格式化参数化数据类型,以便我们可以将类,接口或方法用于许多不同的数据类型。 集合只是具有...