可能的月食错误

时间:2018-12-28 18:35:36

标签: java generics compiler-errors eclipse-oxygen

美好的一天,

我正试图解决一个通用类型的问题。但是似乎没有有效的抱怨时食在抱怨。

考虑以下方法

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就将其消除了,但可悲的是,它也无法解决任何问题。

对于复杂的方法声明很抱歉,但是我有更多具有相同种类/数量参数的模拟方法,没有任何问题。所以我不知道为什么这行不通。

信息:

  • Windows 10
  • Eclipse oxygen.3a释放(4.7.3a)



我希望这是我看不到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

2 个答案:

答案 0 :(得分:2)

我认为这是一个Eclipse JDT编译器错误,尽管我没有查阅过JLS,也没有真正的想法。

我假设的原因有三点:

  1. 您的代码compiles successfully under javac 8u112

  2. 我希望使用自己的参数调用自身的方法可以编译。

  3. 以前,我还遇到过Eclipse compiler disagreed with other compilers的情况。

MCVE重现您的问题:

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

更容易看出resultC类型(其中C extends Collection<? super WrappedFilterResult<? super T, FR>>类型)的适当参数。

但是我们应该以某种方式保护自己免受未经检查的分配...

无论如何,是否有可能简化此代码?由于它具有可读性,因此可维护性值得商......