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