导读:
级别: 高级
Brian Goetz(brian.goetz@sun.com), 高级工程师, Sun Microsystems
2008 年 5 月 26 日
通配符是 Java? 语言中最复杂的泛型之一,特别是围绕捕获通配符的处理和令人困惑的错误消息。在这一期的 Java 理论与实践中,资深 Java 开发人员 Brian Goetz 解释了一些由 javac 生成的怪异错误消息并提供了一些简化泛型使用的技巧和解决方法。
自从泛型被添加到 JDK 5 语言以来,它一直都是一个颇具争议的话题。一部分人认为泛型简化了编程,扩展了类型系统从而使编译器能够检验类型安全;另外一些人认为泛型添加了很多不必要的复杂性。对于泛型我们都经历过一些痛苦的回忆,但毫无疑问通配符是最棘手的部分。
通配符基本介绍
泛型是一种表示类或方法行为对于未知类型的类型约束的方法,比如 “不管这个方法的参数 x和 y是哪种类型,它们必须是相同的类型”,“必须为这些方法提供同一类型的参数” 或者 “foo()的返回值和 bar()的参数是同一类型的”。
通配符 —使用一个奇怪的问号表示类型参数 —是一种表示未知类型的类型约束的方法。通配符并不包含在最初的泛型设计中(起源于 Generic Java(GJ)项目),从形成 JSR 14 到发布其最终版本之间的五年多时间内完成设计过程并被添加到了泛型中。
通配符在类型系统中具有重要的意义,它们为一个泛型类所指定的类型集合提供了一个有用的类型范围。对泛型类 ArrayList而言,对于任意(引用)类型 T,ArrayList
类型是 ArrayList
的超类型(类似原始类型ArrayList和根类型 Object,但是这些超类型在执行类型推断方面不是很有用)。
通配符类型 List
与原始类型 List和具体类型List