如何使用泛型类型转换集合?

时间:2012-02-03 10:53:27

标签: java generics

给出以下代码:

interface IParam {}

class Parameter implements IParam {}

void foo(Collection<? extends IParam> params) {
    SortedSet<? extends IParam> sortedParams;
    if (params instanceof SortedSet)
        sortedParams = (SortedSet<? extends IParam>) params;
    else
        sortedParams = new TreeSet<IParam>(params);
}

我得到的是一些参数集合 我需要的是参数的SortedSet 如果给定的集合已经是SortedSet,我想使用它。
否则,我将使用给定集合的内容创建一个新的TreeSet。

但是,此代码无法编译,并显示有关未选中的强制转换的警告。

有没有办法实现我想要的,而不是抑制警告?

2 个答案:

答案 0 :(得分:3)

编译对我来说很好。我会略微重构代码,以便更容易概念化和维护:

protected <T extends IParam> void foo(Collection<T> params) {
    SortedSet<T> sortedParams;
    if (params instanceof SortedSet)
        sortedParams = (SortedSet<T>) params;
    else
        sortedParams = new TreeSet<T>(params);

    System.out.println(sortedParams);
}

顺便说一句,检查方法中的instanceof虽然不是非法的,但有时也会出现代码异味。您的方法可以通过一些重载来重构:

protected <T extends IParam> void foo(SortedSet<T> params) {
    System.out.println("Doing something with sorted set);
}

protected <T extends IParam> void foo(Collection<T> params) {
    SortedSet<T> sortedParams = new TreeSet<T>(params);
    System.out.println("Doing something with other collection types");
    foo(sortedParams);
}

答案 1 :(得分:1)

您可以通过添加两项内容来使此代码可编辑:

  • 您的方法foo需要在课堂上。 Java不允许在类之外存在方法。
  • 第8行和第10行缺少;。Java中必须使用分号。