Возможная ошибка затмения

Добрый день,

Я пытаюсь разобраться с проблемой общего типа. Но похоже, что затмение жалуется, в то время как нет действительной жалобы.

рассмотрим следующие методы

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
}

Для первого метода затмение жалуется, что не может вызвать filter метод, потому что метод is not applicable for the arguments, Но даже если я позвоню сам, он будет жаловаться.

Думая, что это может быть тип возвращаемого значения, я исправил его, просто вызвав и вернув nullНо, к сожалению, это тоже ничего не решает.

Извините за сложное объявление метода, но у меня есть более симулированные методы с одинаковым типом / количеством параметров, которые работают без проблем. Так что я понятия не имею, почему это не сработает.

Информация:

  • Windows 10
  • Eclipse oxygen.3a Release (4.7.3a)



Я надеюсь, что это что-то незначительное, что я не вижу, любая помощь приветствуется.

заранее спасибо


редактировать

Объявления класса, если они кому-то нужны

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
ссылка на тему 1 на форуме eclipse bugzilla ссылка на тему 2 на форуме eclipse bugzilla

2 ответа

Решение

Я предполагаю, что это ошибка компилятора Eclipse JDT, хотя я не обращался к JLS и тоже не очень-то стараюсь копаться в ней.

Причины моего предположения тройные:

  1. Ваш код успешно компилируется под Javac 8u112

  2. Я ожидаю, что метод, вызывающий себя со своими собственными параметрами, должен скомпилироваться.

  3. Ранее я также столкнулся с случаем, когда компилятор Eclipse не согласился с другими компиляторами.

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

Похоже, это ошибка. В списке 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>>,

Но мы должны как-то защитить себя от непроверенного назначения...

Во всяком случае, может быть, есть возможность упростить этот код? Поскольку это удобочитаемость и, следовательно, ремонтопригодность является чем-то спорным...

Другие вопросы по тегам