[英]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.