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


Примечания стороны:

  1. peek() будет только отлаживать только первый StateProbability - это твое намерение?
  2. рассмотреть возможность добавления greaterThan() метод для StateProbability так что вам не нужно повторно звонить getProbability().greaterThan(), (Если ответ № 1 - "нет", этот метод также будет хорошим местом для размещения оператора отладки.)
  3. рассмотреть возможность добавления метода на SceneState что бы вернуть предварительно отфильтрованный список, как Seq<StateProbability> SceneState.allGreaterThan(Probability),
Другие вопросы по тегам