java generic
摘自
Generics in the Java Programming Language
Gilad Bracha
July 5, 2004
希望对从C#转Java的朋友有点帮助
最基本的
List<String> ls = new ArrayList<String>(); //1 没问题
List<Object> lo = ls; //2 编译错误,这应该是一个协变过程,c#4.0已经支持
通配符
考虑设计一个方法:
// 非泛型写法
void printCollection(Collection c) {
Iterator i = c.iterator();
for (k = 0; k < c.size(); k++) {
System.out.println(i.next());
}
}
// 泛型写法,比普通写法反而多了限制,参数入口类型更严格了,但却没有带来任何好处
void printCollection(Collection<Object> c) {
for (Object e : c) {
System.out.println(e);
}
}
// 使用带通配符的泛型,入口宽松
void printCollection(Collection<?> c) {
for (Object e : c) {
System.out.println(e);
}
}
List<?> listUnknown = new ArrayList<Strign>();
listUnknown.add(null); // ok, null is subtype of any type
listUnknown.add(new Object()); // compile error, unknown type ?
listUnknown.get(0).toString(); // ok, list element must be type of Object
限定通配符
public abstract class Shape {
public abstract void draw();
}
public class Circle extends Shape {
@Override
public void draw() {
}
}
public class Rectangle extends Shape {
@Override
public void draw() {
}
}
public static void drawall(List<? extends Shape> shapes) {
for(Shape s : shapes) {
s.draw(); // ok
}
}
public static void addShape(List<? extends Shape> shapes) {
shapes.add(new Rectangle()); // complie error
// don't know whether ? is Rectangle's super type
}
泛型方法
static void fromArrayToCollection(Object[] a, Collection<?> c) {
for (Object o : a) {
c.add(o); // compile time error
}
}
static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
for (T o : a) {
c.add(o); // correct
}
}
后记
- 通配符的目的是在不同的调用位置使用不同的类型参数,它比泛型方法中的类型参数应用范围更广(如可以用来声明变量),使用也更灵活。
- 而泛型方法则只有在方法体或返回值依赖于入口参数类型时才应该使用(其它情况优先使用通配符)。
class Collections {
public static <T, S extends T> void copy(List<T> dest, List<S> src){...}
}
// 可以重写为:
// 因为方法体内并没有对S的依赖。
class Collections {
public static <T> void copy(List<T> dest, List<? extends T> src){...}
}
分享到:
相关推荐
Java1.5泛型指南中文版(Java1.5 GenericTutorial)
Java 8 简明教程 Java 8 Tutorial中文版 “Java并没有没落,人们很快就会发现这一点” 欢迎阅读我编写的Java 8介绍。本教程将带领你一步一步地认识这门语言的新特 性。通过简单明了的代码示例,你将会学习到如何使用...
目前为止能找到的最新版本。资料很难得。 Java 3D Tutorial v1.6.2 (Java 3D API v1.2) Getting Started with the Java 3D API A Tutorial for Beginners
Java 3D 是一个用于在Java环境中展示三维图形的扩展库。它允许开发者编写的应用程序在多种类型的计算机上运行,并支持互联网上的交互。这个库提供了一个比大多数其他图形库更简洁的接口,同时具备创建高质量游戏和...
《Java2 Tutorial-5.0》是一份针对Java 2平台第五版(也称为Java 5.0)的详尽教程,旨在帮助开发者深入理解和掌握Java编程语言的关键概念和技术。这个教程涵盖了广泛的Java编程主题,从基础语法到高级特性,为初学者...
java tutorialjava tutorial.chm
最新的Java EE Tutorial chm文档,到今天(2013-05-03)为止最新,最完整 GlassFish Update Tool更新到Java EE Tutorial 6.0.8-1(January 2013) 今天使用FAR HTML 5编译成最完整的chm文档(所有文件均编译进去,如果你反...
Java教程2008-03-14 这篇教程主要涵盖了2008年3月14日时Java编程语言的关键概念和技术。Java是一种广泛使用的面向对象的编程语言,以其跨平台的能力、高效性和安全性而闻名。在这个教程中,我们将深入探讨以下几个...
Java Tutorial Java官方教程。
《Java教程》是一款深受开发者喜爱的Java学习资源,它提供了全面且深入的Java编程知识,旨在帮助初学者和有经验的程序员掌握Java语言的核心概念和技术。这个教程以其清晰的结构和丰富的实例闻名,使得学习过程既有趣...
Addison.Wesley.The.Java.Tutorial
《Java Tutorial》是Java编程学习者的一份重要参考资料,它以详尽且深入的方式介绍了Java语言的基础知识。这个英文版教程旨在帮助初学者和有一定经验的开发者掌握Java编程的核心概念和技术。 首先,让我们来深入...
《Java EE 5 Tutorial》是Java企业版5(Java Platform, Enterprise Edition 5,简称Java EE 5)的官方教程,旨在帮助开发者理解和掌握在Java平台上构建分布式、多层的企业级应用程序。本教程以CHM(Compiled ...
### Java3D教程详解 #### 一、关于本教程 本教程主要面向具有Java编程经验但缺乏三维(3D)编程背景的程序员。它将从基础的3D概念出发,逐步深入到Java3D的核心——场景图(Scenegraph)构建,这是描述我们想要...
SUN网站上找的英文版JAVA教程,Java Tutorial,只要你英文过四级,这绝对是JAVA SE最棒的学习资料.内容基本含概了JAVA SE的所有方面,从基本语法,继承,Generic,IO,序列化,到JavaBean,Swing组件,XML,正则表达式,JDBC,JAVA...
A hands-on guide to the Java programming language, The Java™ Tutorial, Fourth Edition is perfect for any developer looking for a proven path to proficiency with Java SE. This popular tutorial "from ...
### Java 3D 教程概述 #### 一、Java 3D 简介 Java 3D 是 Java 平台的一个扩展库,用于显示三维图形。它为开发人员提供了一个比大多数其他图形库更简单的接口,同时具有足够的功能来创建高质量的游戏和动画。Java ...
从给定的文件信息来看,这是一本关于Java JDK 1.4的教程书籍的预览部分,由Greg M. Travis编写,出版社为Manning Publications Co.。虽然提供的部分内容并没有包含实际的技术细节,但我们可以根据标题、描述以及部分...
《Java EE 5 Tutorial》是Java企业版5(Java Platform, Enterprise Edition 5)的一份官方教程,旨在帮助开发者深入理解和掌握Java EE平台的核心技术。这份文档详细介绍了如何使用Java EE 5进行分布式应用程序的开发...