您的位置:首页 > 编程语言 > Java开发

Eclipse 3.1中的Java泛型支持2

2008-05-06 13:38 387 查看

Eclipse 3.1中的Java泛型支持

2005-12-09 09:00 作者: Neal Ford 出处: IBM 责任编辑:方舟
从特定类型向泛型转换

  请考虑清单 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() 方法调用而变得清洁多了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: