Eclipse помечает (рабочий) код как ошибку компиляции и не будет работать
У меня есть довольно сложный код, который использует Javaslang. Если я соберу его в банку, он будет работать нормально. Однако, когда я пытаюсь войти в него в Eclipse для отладки, Eclipse помечает его как ошибку компиляции и умирает, когда он достигает этой строки. Особенно странно то, что это сработало неделю назад, а код за это время не изменился.
Вещи, которые я пробовал:
- чистый проект (включая снятие отметки "строить автоматически")
- удалить проект из Eclipse, удалить.project и.settings, повторно импортировать с нуля
- удалить проект из Eclipse, удалить.project,.classpath,.settings, сделать mvn eclipse: eclipse, reimport
Maven создает это без ошибок [как в Eclipse, так и из командной строки]. Я могу запустить проект, от которого это зависит, и получить доступ к этому коду из JAR, поэтому я знаю, что он работает. Я просто не могу позволить Eclipse получить доступ к коду из проекта ни в режиме "run", ни в режиме "debug".
Seq<Tuple2<StateProbabilityVector, ScenData>> resultStateProbs =
futures.
flatMap(Future::get).
toList();
// Update the target counts.
// THIS ENTIRE STATEMENT IS THE ERROR
Seq<Tuple2<ScenState, Probability>> result =
resultStateProbs.flatMap(tuple -> tuple.apply((spv, baTargetCount) ->
{
return spv.getStateProbList().
peek(sp -> logger.debug("Checking if {} > {}: {}",
sp.getProbability(),
intermediateMinProb,
sp.getProbability().greaterThan(intermediateMinProb))).
filter(sp -> sp.getProbability().greaterThan(intermediateMinProb)).
map(sp -> updateScenarioData(sp, baTargetCount, dupStateInfo));
}));
// signature for updateScenarioData
protected abstract Tuple2<ScenState, Probability> updateScenarioData(StateProbability stateProb,
ScenData scenData,
DSI dupStateInfo);
// truncated def of StateProbabilityVector
@Getter @ToString @Builder
public class StateProbabilityVector {
@NonNull
private final Seq<StateProbability> stateProbList;
}
Таким образом, все типы верны, но Eclipse утверждает:
> Type mismatch: cannot convert from Object to Iterable<? extends
> Object>
> Type mismatch: cannot convert from Seq<Object> to
> Seq<Tuple2<ScenState,Probability>>
1 ответ
Как отмечает Нандор, это, вероятно, связано с различием между компилятором Eclipse и javac, и проблему, вероятно, можно решить с помощью свидетеля типа в нужном месте. Чтобы найти правильное место, я бы начал с разрыва цепочки функциональных методов и извлечения некоторых локальных переменных:
Seq<Tuple2<ScenState, Probability>> result =
resultStateProbs.flatMap(tuple -> {
Seq<Tuple2<ScenState, Probability>> filteredAndUpdated =
tuple.apply((spv, baTargetCount) -> {
Seq<StateProbability> stateProbList = spv.getStateProbList();
stateProbList.peek(sp -> {
logger.debug("Checking if {} > {}: {}", sp.getProbability(), intermediateMinProb, sp.getProbability().greaterThan(intermediateMinProb));
});
Seq<StateProbability> filtered = stateProbList.filter(sp ->
sp.getProbability().greaterThan(intermediateMinProb));
Seq<Tuple2<ScenState, Probability>> updated = filtered.map(sp ->
updateScenarioData(sp, baTargetCount, dupStateInfo));
return updated;
});
return filteredAndUpdated;
});
Если вы используете рефакторинг извлечения переменных в Eclipse, это само по себе может сказать вам, где он выводит неправильные типы, и явного объявления правильных типов локальных переменных может быть достаточно, чтобы решить проблему самостоятельно.
Если нет, то это должно как минимум сузить ошибку и показать вам, где именно в цепочке вызовов Eclipse испытывает проблемы. Затем вы можете, вероятно, исправить это с помощью свидетелей типов или, если ничего не получится, явным приведением, а затем (с добавлением этой информации о типе), возможно, снова встроить переменные, хотя этот код достаточно плотный, чтобы я мог их оставить.
Примечания стороны:
peek()
будет только отлаживать только первыйStateProbability
- это твое намерение?- рассмотреть возможность добавления
greaterThan()
метод дляStateProbability
так что вам не нужно повторно звонитьgetProbability().greaterThan()
, (Если ответ № 1 - "нет", этот метод также будет хорошим местом для размещения оператора отладки.) - рассмотреть возможность добавления метода на
SceneState
что бы вернуть предварительно отфильтрованный список, какSeq<StateProbability> SceneState.allGreaterThan(Probability)
,