- 浏览: 25843 次
- 性别:
- 来自: 杭州
最新评论
通过在类的定义中添加一个形式类型参数列表,可以将类泛型化。方法也可以被泛型化,不管它们定义在其中的类是不是泛型化的。
泛型类在多个方法签名间实施类型约束。在List<V>中,类型参数V出现在get()、add()、contains()等方法的签名中。当创建一个Map<K, V>类型的变量时,您就在方法之间宣称一个类型约束。您传递给add()的值将与get()返回的值的类型相同。
类似地,之所以声明泛型方法,一般是因为您想要在该方法的多个参数之间宣称一个类型约束。例如,下面代码中的ifThenElse()方法,根据它的第一个参数的布尔值,它将返回第二个或第三个参数:
注意,您可以调用ifThenElse(),而不用显式地告诉编译器,您想要T的什么值。编译器不必显式地被告知 T 将具有什么值;它只知道这些值都必须相同。编译器允许您调用下面的代码,因为编译器可以使用类型推理来推断出,替代T的String满足所有的类型约束:
类似地,您可以调用:
但是,编译器不允许下面的代码,因为没有类型会满足所需的类型约束:
为什么您选择使用泛型方法,而不是将类型T添加到类定义呢?(至少)有两种情况应该这样做:
* 当泛型方法是静态的时,这种情况下不能使用类类型参数,但是可以使用泛型方法
* 当 T 上的类型约束对于方法真正是局部的时,这意味着没有在相同类的另一个 方法签名中使用相同 类型 T 的约束。通过使得泛型方法的类型参数对于方法是局部的,可以简化封闭类型的签名。
考虑例子Matrix类,它使用类型参数V,该参数由Number类来限制:
编译器允许您创建Matrix<Integer>或Matrix<Float>类型的变量,但是如果您试图定义Matrix<String>类型的变量,则会出现错误。类型参数V被判断为由Number限制。在没有类型限制时,假设类型参数由Object限制。这就是为什么泛型方法 中的例子,允许List.get()在List<?>上调用时返回Object,即使编译器不知道类型参数V的类型。
泛型类在多个方法签名间实施类型约束。在List<V>中,类型参数V出现在get()、add()、contains()等方法的签名中。当创建一个Map<K, V>类型的变量时,您就在方法之间宣称一个类型约束。您传递给add()的值将与get()返回的值的类型相同。
类似地,之所以声明泛型方法,一般是因为您想要在该方法的多个参数之间宣称一个类型约束。例如,下面代码中的ifThenElse()方法,根据它的第一个参数的布尔值,它将返回第二个或第三个参数:
public <T> T ifThenElse(boolean b, T first, T second) { return b ? first : second; }
注意,您可以调用ifThenElse(),而不用显式地告诉编译器,您想要T的什么值。编译器不必显式地被告知 T 将具有什么值;它只知道这些值都必须相同。编译器允许您调用下面的代码,因为编译器可以使用类型推理来推断出,替代T的String满足所有的类型约束:
String s = ifThenElse(b, "a", "b");
类似地,您可以调用:
Integer i = ifThenElse(b, new Integer(1), new Integer(2));
但是,编译器不允许下面的代码,因为没有类型会满足所需的类型约束:
String s = ifThenElse(b, "pi", new Float(3.14));
为什么您选择使用泛型方法,而不是将类型T添加到类定义呢?(至少)有两种情况应该这样做:
* 当泛型方法是静态的时,这种情况下不能使用类类型参数,但是可以使用泛型方法
* 当 T 上的类型约束对于方法真正是局部的时,这意味着没有在相同类的另一个 方法签名中使用相同 类型 T 的约束。通过使得泛型方法的类型参数对于方法是局部的,可以简化封闭类型的签名。
考虑例子Matrix类,它使用类型参数V,该参数由Number类来限制:
public class Matrix<V extends Number> { ... }
编译器允许您创建Matrix<Integer>或Matrix<Float>类型的变量,但是如果您试图定义Matrix<String>类型的变量,则会出现错误。类型参数V被判断为由Number限制。在没有类型限制时,假设类型参数由Object限制。这就是为什么泛型方法 中的例子,允许List.get()在List<?>上调用时返回Object,即使编译器不知道类型参数V的类型。
发表评论
-
spring bean初始化
2015-05-20 17:51 4521.配置文件中每一个<bean>解析成一个Bean ... -
java 基本类型存储解析
2012-07-11 12:53 965byte b=-128; byte b=127; 都是可以编 ... -
nio
2012-01-31 16:57 755原来的I/O包和NIO处理数据最大的不同之处在于数据打 ... -
null
2012-01-30 17:34 526null可以转换成任何类的对象 -
java 线程的几个方法
2012-01-17 15:39 973Thread的方法 sleep() 1. sleep ()函 ... -
java 线程
2012-01-17 14:37 708现在的系统的都是分时系统,达到多进程的效果。cpu只是将时间 ... -
java 访问修饰符
2012-01-12 10:34 674对于类成员(字段和方法)的访问权限来说, public:所有类 ... -
设计模式初学
2012-01-10 17:39 666代理模式只是原来对象的一个替身(原来对象约束了代理的行为) ... -
jndi学习
2012-05-26 19:10 689jndi--命名和目录服务api 用于查找远程的资源,例如 ... -
java 泛型学习--类型擦除
2011-12-26 17:58 1678类型擦除(type erasure)。 Java中的泛型基本上 ... -
java 泛型学习--类型通配符
2011-12-26 17:17 842假设您具有该方法: void printList(Lis ... -
java 泛型学习
2011-12-26 16:42 743除了异常类型、枚举或匿名内部类以外,任何类都可以具有类型参数。 ... -
servlet path学习
2011-12-22 15:40 897servlet path就是取从context path后开始 ... -
log4j 学习
2011-12-16 11:01 904Log4j除了可以记录程序 ... -
java 可变长参数
2011-12-15 15:15 336[size=x-large] java 的可变长参数 例如: ... -
java垃圾回收
2011-12-12 19:16 614Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现 ... -
velocity性能优化
2011-12-09 11:16 9161.char to byte 字符转变字节,流用字节去输出 ... -
velocity 宏
2011-12-12 19:16 10891.方法当作参数化 当使用引用作为参数传递给Velocity ... -
ThreadLocal
2011-11-10 14:48 656每个线程有一个ThreadLocalMap对象,这是一个Map ... -
struts2 Codebehind Plugin
2011-11-08 15:32 3281.为未定义的action指定mapping When no ...
相关推荐
全面总结Java泛型--实例
Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力...
【Java基础】泛型方法 - 右撇子 - 博客频道 - CSDN.NET
这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”...
个人制作且上课使用的课件,希望对大家初步了解泛型相关内容有一定的帮助。个人制作且上课使用的课件,希望对大家初步了解泛型相关内容有一定的帮助。
补充知识:泛型1---马克-to-win java视频的详细描述与介绍
java 泛型方法使用示例 java 泛型方法使用示例 java 泛型方法使用示例
java,学习java泛型,java培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptx
Java泛型编程指南.pdf 此文章译自SUN的泛型编程指南
Java Generics and Collections 英文版,详细描述java 泛型技术
这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...
补充知识2 ---马克-to-win java视频泛型的详细描述与介绍
Java泛型和集合]-英文版
java 泛型接口示例 java 泛型接口示例 java 泛型接口示例
java泛型源码Java泛型用法 步骤1 原始类型有问题。 第2步 使用泛型类型。 第三步 车库和车辆。 原始类型。 第四步 首先尝试生成车库。 木星在我的车库里。 第5步 泛型上限。 第6步 TripleGarage 步骤7 试图使用泛型...
java 泛型类的类型识别示例 java 泛型类的类型识别示例 java 泛型类的类型识别示例
java泛型学习
java泛型技术之发展,学习JAVA 泛型的不错东东
1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1....
要学习java泛型吗?这里是我专门到网站上下载的一些页面,有助于我们全面的学习Java的泛型,好让我们一起学习,分享