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

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

0 голосов
/ 28 декабря 2018

Добрый день,

Я пытаюсь разобраться с проблемой общего типа.Но похоже, что 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.Но даже если я сделаю самозвонок, он будет жаловаться.

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

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

Информация:

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



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

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


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

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

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Я полагаю, что это ошибка компилятора 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);
}
0 голосов
/ 28 декабря 2018

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

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

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

...