繁体   English   中英

如何转换具有通用类型的集合?

[英]How can I cast a collection with generic type?

给出以下代码:

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。

但是,此代码不会与有关未经检查的强制类型转换的警告一起编译。

有什么方法可以实现我想要的,而不会抑制警告?

编译对我来说很好。 我将稍微重新组织代码,以使其更易于概念化和维护:

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);
}

您可以通过添加以下两点使此代码可编译:

  • 您的方法foo需要在一个类中。 Java不允许在类之外存在方法。
  • 失踪; 在第8行和第10行。分号在Java中是必需的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM