给出以下代码:
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。
但是,此代码无法编译,并显示有关未选中的强制转换的警告。
有没有办法实现我想要的,而不是抑制警告?
答案 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不允许在类之外存在方法。;
。Java中必须使用分号。