美好的一天,
我正试图解决一个通用类型的问题。但是似乎没有有效的抱怨时食在抱怨。
考虑以下方法
public static <FR extends FilterResult, T> List<? super WrappedFilterResult<? super T, FR>> filter(String check, Collection<T> elements, Function<? super T, String> converter, Filter<? extends FR> filter, ACComparator<? super WrappedFilterResult<? super T, ? super FR>> comparator)
{
// eclipse says 'filter' doesn't accept these arguments
return filter(check, elements, new ArrayList<>(), converter, filter, comparator);
// doing a self call will result in the same error?
// return filter(check, elements, converter, filter, comparator);
// calling without returning doesn't solve it either?
// filter(check, elements, converter, filter, comparator);
// return null;
}
// no complaints here
public static <FR extends FilterResult, T, C extends Collection<? super WrappedFilterResult<? super T, FR>>> C filter(String check, Collection<T> elements, C result, Function<? super T, String> converter, Filter<? extends FR> filter, ACComparator<? super WrappedFilterResult<? super T, ? super FR>> comparator)
{
// content
}
对于第一个方法eclipse抱怨它不能调用filter
方法,因为方法is not applicable for the arguments
。但是,即使我打个电话,它也会抱怨。
认为这可能是返回类型,我仅通过调用并返回null
就将其消除了,但可悲的是,它也无法解决任何问题。
对于复杂的方法声明很抱歉,但是我有更多具有相同种类/数量参数的模拟方法,没有任何问题。所以我不知道为什么这行不通。
信息:
我希望这是我看不到atm的小问题,感谢您的帮助。
预先感谢
修改
是否有人需要类声明
public static class FilterResult {}
public interface Filter<FR extends FilterResult> {}
public static class WrappedFilterResult<T, FR extends FilterResult> extends FilterResult {}
public interface ACComparator<FR extends FilterResult> {}
已提交到Bugzilla
the eclipse bugzilla forum上的线程链接1
the eclipse bugzilla forum上的线程链接2
答案 0 :(得分:2)
我认为这是一个Eclipse JDT编译器错误,尽管我没有查阅过JLS,也没有真正的想法。
我假设的原因有三点:
我希望使用自己的参数调用自身的方法可以编译。
以前,我还遇到过Eclipse compiler disagreed with other compilers的情况。
public static class FilterResult {}
public static class WrappedFilterResult<T, FR extends FilterResult> extends FilterResult {}
public interface ACComparator<FR extends FilterResult> {}
public static <FR extends FilterResult, T>
void filter1(ACComparator<? super WrappedFilterResult<? super T, ? super FR>> comparator) {
// both compile fine with normal Java compiler
// but error with Eclipse JDT compiler (I'm using Eclipse 4.9.0)
filter1(comparator);
filter2(comparator);
}
public static <FR extends FilterResult, T>
void filter2(ACComparator<? super WrappedFilterResult<? super T, ? super FR>> comparator) {
}
对于Eclipse,将有问题的类型(在这种情况下为ACComparator<...etc>
)拉成泛型类型参数似乎已经解决了这个问题。
public static
< FR extends FilterResult, T,
A extends ACComparator<? super WrappedFilterResult<? super T, ? super FR>> // <-- here
>
void filterSuccess(A comparator) {
// success!
filter1(comparator);
filter2(comparator);
}
答案 1 :(得分:1)
似乎是错误。在列表中,Idea并未显示该代码上的任何错误。
问题出在此行new ArrayList<>()
return filter(check, elements, new ArrayList<>(), converter, filter, comparator);
如果我们将其替换为result
变量,定义为
List<? super WrappedFilterResult<? super T, FR>> result = new ArrayList<>();
更容易看出result
是C
类型(其中C extends Collection<? super WrappedFilterResult<? super T, FR>>
类型)的适当参数。
但是我们应该以某种方式保护自己免受未经检查的分配...
无论如何,是否有可能简化此代码?由于它具有可读性,因此可维护性值得商......