技术开发 频道

Eclipse 3.1中的Java泛型支持



    请考虑清单 1 中的简单类,它创建了一个 Employee 和 Manager 对象的列表(Manager 扩展自 Employee),将他们打印出来,给他们涨工资后再打印出来。

清单 1. HR 类

package com.nealford.devworks.generics.generics; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class HR { public HR() { List empList = new ArrayList(5); empList.add(new Employee("Homer", 200.0, 1995)); empList.add(new Employee("Lenny", 300.0, 2000)); empList.add(new Employee("Waylon", 700.0, 1965)); empList.add(new Manager("Monty", 2000.0, 1933, (Employee) empList.get(2))); printEmployees(empList); System.out.println("----- Give everyone a raise -----"); for (int i = 0; i < empList.size(); i++) ((Employee) empList.get(i)).applyRaise(5); printEmployees(empList); System.out.println("The maximum salary for any employee is "+ Employee.MAX_SALARY); System.out.println("Sort employees by salary"); Collections.sort(empList); printEmployees(empList); System.out.println("Sort employees by name"); Collections.sort(empList, new Employee.NameComparer()); printEmployees(empList); System.out.println("Sort employees by hire year"); Collections.sort(empList, Employee.getHireYearComparator()); printEmployees(empList); } public void printEmployees(List emps) { for (int i = 0; i < emps.size(); i++) System.out.println(emps.get(i)); } public static void main(String[] args) { new HR(); } }
如果您打开了 Java 5 支持,编译这段代码会出现多种警告信息。

  快速修复特性

  每当 Eclipse 要给您的代码建议一种改进时,Eclipse 的快速修复特性就显示为编辑器窗口左侧边栏上的一个灯泡。在清单 1 中的代码中,您将会看到多个快速修复。

图 3. 快速修复灯泡指示您的代码待改进



快速修复使用灯泡和黄色波浪线指示待改进处。如果将鼠标移动至黄色波浪线上,可以看到出现在图 4 中的改进建议。

图 4. 快速修复指示什么应该被通用化



    这里所列的快速修复建议只有一条建议。边上的灯泡提出建议,添加一个本地变量保存 List 的 add() 方法的返回值。然而,在这里该方法返回一个布尔类型值,并且被忽略了。

  为了定位快速修复建议,移至重构菜单。Eclipse 中很多重构与 Java 5 中的泛型直接相关。“Infer Generic Type Arguments”重构将给列表增加泛型支持。 第一个对话框允许您选择选项。

图 5. Infer Generic Type Arguments choices 对话框



    第一个选项与一个结论相关,这个结论是 clone() 方法将返回接收者类型而不是另外一个类型(相关类)。大部分功能良好的类都遵守这个规则,如果您知道您的类不遵守这个规则,则不要选中这个选项。当第二个选项未选中时,将保留“raw”(非泛型)参数,而不是推断出正确的泛型参数类型。

  Eclipse 中的大多数重构中,您都可以预览您的类将发生什么变化。点击这个对话框上的 Preview 按钮将出现图 6 所示的对话框。

图 6. Preview the generic refactoring



更新后的代码如下:

清单 2. 更新后的代码

            List<Employee> empList = new ArrayList<Employee>(5);
            empList.add(new Employee("Homer", 200.0, 1995));
            empList.add(new Employee("Lenny", 300.0, 2000));
            empList.add(new Employee("Waylon", 700.0, 1965));
            empList.add(new Manager("Monty", 2000.0, 1933, empList.get(2)));
            

  代码发生了两个有趣的变化。第一 —— 也是最明显的 —— List 和 ArrayList 声明现在是 Employee 类型的泛型。第二 —— 不太明显 —— 代码最后一行发生的变化。您观察一下 Manager 类的原来的 empList 添加,它的最后一个参数需要针对 Assistant 域强制类型转换为 Employee。而 Infer 重构足够聪明,它可以删除现在不必要的类型强制转换。

  在介绍完快速修复之前,Eclipse 还在 Java 5 支持中增加了另外一个有趣的方面:您可以得到为方法添加注释的建议,比如 @Override。您还具有针对注释的内容帮助。

图 7. 针对注释的快速修复和内容帮助扩展



快速帮助特性

  Eclipse V3.1 已经添加了快速帮助以促进 Java 5 中的泛型支持。请考虑这个普通的 for() 循环,参见清单 3 中的 printEmployees() 方法。

清单 3. for() 循环

            public void printEmployees(List<Employee> emps) {
            for (int i = 0; i < emps.size(); i++)
            System.out.println(emps.get(i));
            }
            

  除了对泛型的支持外,Java 5 现在也支持 for...each 循环。快速帮助建议将 for loop 变成 for...each,变化后的代码如清单 4 所示。

清单 4. for...each 循环

            public void printEmployees(List<Employee> emps) {
            for (Employee emp : emps)
            System.out.println(emp);
            }
            

  这个版本由于完全删除了 i 变量和 get() 方法调用而变得清洁多了。
0
相关文章