`
chenk008
  • 浏览: 25843 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java 泛型学习--泛型方法

    博客分类:
  • java
 
阅读更多
通过在类的定义中添加一个形式类型参数列表,可以将类泛型化。方法也可以被泛型化,不管它们定义在其中的类是不是泛型化的。
泛型类在多个方法签名间实施类型约束。在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的类型。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics