原生类型的处理

下面的程序一个一的类构成,该一对型相的对。它大量使用了5.0 性,包型、 自动变长参数(varargs)和 for-each 环。那么它会打印什么
import java.util.*;
public class Pair<T> {
 private final T first;
 private final T second;
 public Pair(T first,  T second) {
 this.first = first;
 this.second = second;
 }
 public T first() {
 return first;
 }
 public T second() {
 return second;
 }
 public List<String> stringList() {
 return Arrays.asList(String.valueOf(first) ,
 String.valueOf(second));
 }
 public static void main(String[]  args) {
 Pair p = new Pair<Object> (23, "skidoo");
 System.out.println(p.first() + " " + p.second());
 for (String s :  p.stringList())
 System.out.print(s + " ");
 }
}
这段程序看上去似相当简单。它创建了一个对对,其中一个是一个表23 Integer 对第二是一个串“ skidoo,然后这段程序将打印这个对对的一个和第二,并用一个空格。最后它代这些元的 string ,并且次打印,所以这段程序应该打印 23 skidoo
。然而可的是,它不能通过编译。更的是, 编译的错误消息更是另人
Pair. java: 26: incompatible types;
found: Object, required: String
for (String s : p.stringList())
^
如果 Pair.stringList 是返回 List<Object>的话,那么这个错误消息还是可以的,但是事实是它返回的是List<String>么回事呢
这个分奇现象是因为程序使用了型(raw type)而起的。一个型就是一个有任何型参数的如, List<E>是一个 List<String> 是一个参数型,而 List 就是一个型。在我们的程序中,唯一用到型的地方就是在 main 方法中对部变p 的
Pair p = new Pair
List<String>实现了参数Iterable<String>时, List 也实现
Iterable。 Iterable<String>有一个 iterator 方法返回参数Iterator<String>,相应地, Iterable 有一个 iterator 方法返回Iterator。当 Iterator<String>的 next 方法返回 String 时, Iterator 的 next
方法返回 Object。因此, 代 p.stringList()需要一个 Object 型的变量,这就解释编译的那个奇的错误消息来。这种现象人想因在于参数List<String>然是方法 stringList 的返回型,但它与Pair 的型参数关系事实上最后它被除了 。
你可以通过变量类从 String Object 这一法来解决这个问
题:
// Dont do this; it doesnt really fix the problem!
for (Object s : p.stringList())
System.out.print(s + " ");
程序输出了满意的结果,但是它并解决这个问题。你会失
来的所有,并且如果该环在 s 上调用了任何 String 方法,那么程
不能通过编译。正确解决这个问题的方法是为部变量 p 提供一个合
参数
Pair<Object> p = new Pair<Object>(23, "
上,这种问题在用 getAnnotation 方法在运行Class 的注解
(annotations)的情况生,该方法是在 5.0 加到 Class
的。每调用 getAnnotation 方法时都会涉及到两个 Class 对:一个是在其上
调用该方法的对一个是作为传递参数需要注解的对。在一
型的调用中, 前者通过射获得的,而后是一个称字常量,如下
Author a = Class.forName(name). getAnnotation(Author.class);
你不getAnnotation 的返回值转型为 Author。以下两种制保了这种
法可以正常工作:( 1) getAnnotation 方法是型的。它是通过它的参数
来确定返回型的。具地说,它接受一个 Class<T>型的参数,返回一个 T型的值。( 2) 称字常量提供如,Author.class 的
Class<Author>称字常量可以传递运行时和编译时的。以这
种方式使用的称字常量型符号(type token) [Bracha04]
称字常量不同的是, 通过射获得的 Class 对不能提供完整的
Class.forName 的返回型是Class<?>。在调用 getAnnotation
方法的表达式中,使用的是型而不是Class,这一要。如
果你用了 型,返回的注解具有的就是编译的 Annotation 型而不是通过类称字




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值