gpt4 book ai didi

java - Eclipse 将(工作)代码标记为编译错误并且不会运行

转载 作者:行者123 更新时间:2023-12-02 12:52:31 25 4
gpt4 key购买 nike

我有一些使用 Javaslang 的相当复杂的代码。如果我把它编译成jar,它运行得很好。然而,当我尝试在 Eclipse 中单步调试它时,Eclipse 将其标记为编译错误,并在到达该行时终止。特别奇怪的是,这在一周前就起作用了,并且代码在此期间没有改变。

我尝试过的事情:

  • 清理项目(包括取消选中“自动构建”)
  • 从 Eclipse 中删除项目,删除 .project 和 .settings,然后重新导入从头开始
  • 从 Eclipse 中删除项目,删除 .project、.classpath、.settings、执行 mvn eclipse:eclipse、重新导入

Maven 构建它时没有错误 [无论是在 Eclipse 中还是从命令行]。我可以运行它所依赖的项目并让它从 JAR 访问此代码,所以我知道它可以工作。我只是无法让 Eclipse 在“运行”或“调试”模式下访问项目中的代码。

    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>>

最佳答案

Nándor comments ,这可能是由于 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) .

关于java - Eclipse 将(工作)代码标记为编译错误并且不会运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44570476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com