可能的日食错误

Possible eclipse bug

我正在努力解决一个通用类型的问题。但似乎 eclipse 在抱怨,而没有有效的抱怨。

考虑以下方法

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。但即使我进行自我调用,它也会抱怨。

认为它可能是 return 类型我通过调用和 returning null 消除了它,但遗憾的是这也没有解决任何问题。

对于复杂的方法声明,我们深表歉意,但我有更多具有相同 kind/amount 参数的类似方法,没有任何问题。所以我不知道为什么这行不通。

信息:

我希望它是个小问题,我没有看到 atm,我们将不胜感激。

提前致谢


编辑

class 声明,如果有人需要的话

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

似乎就是这个错误。在列表中,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>>.

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

无论如何,是否有可能简化这段代码?由于它的可读性和可维护性是有争议的...

我认为这是一个 Eclipse JDT 编译器错误,尽管我没有咨询过 JLS,也不想深入研究它。

我的假设有三个原因:

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

  2. 我希望用自己的参数调用自身的方法应该编译。

  3. 之前我也运行遇到过.

  4. 的情况

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

解决方法:

将有问题的类型(ACComparator<...etc> 在这种情况下)拉入泛型类型参数似乎解决了 Eclipse 的这个问题。

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