gpt4 book ai didi

Java8- "effectively final"

转载 作者:搜寻专家 更新时间:2023-11-01 01:34:07 25 4
gpt4 key购买 nike

我正在使用 RxVertx,它是一种 RxJava 和 Java8,但我遇到了编译错误。

这是我的代码:

public rx.Observable<Game> findGame(long templateId, GameModelType game_model, GameStateType state) {

return context.findGame(templateId, state)
.flatMap(new Func1<RxMessage<byte[]>, rx.Observable<Game>>() {

@Override
public Observable<Game> call(RxMessage<byte[]> gameRawReply) {

Game game = null;

switch(game_model) {

case SINGLE: {

ebs.subscribe(new Action1<RxMessage<byte[]>>() {

@Override
public void call(RxMessage<byte[]> t1) {

if(!singleGame.contains(0) {
game = new Game(); // ERROR is at this line
singleGames.put(0, game);
} else {
game = singleGames.get(0); // ERROR is at this line
}
}
});
}
}

return rx.Observable.from(game);
}
});
}

编译错误是:“在封闭范围内定义的局部变量游戏必须是最终的或实际上是最终的”

我无法将“游戏”定义为 final,因为我进行了分配\设置并在函数末尾返回它。

我怎样才能编译这段代码??

谢谢。

最佳答案

我有一个 Holder 类,可用于此类情况。

/**
* Make a final one of these to hold non-final things in.
*
* @param <T>
*/
public class Holder<T> {
private T held = null;

public Holder() {
}

public Holder(T it) {
held = it;
}

public void hold(T it) {
held = it;
}

public T held() {
return held;
}

public boolean isEmpty() {
return held == null;
}

@Override
public String toString() {
return String.valueOf(held);
}

}

然后您可以执行以下操作:

final Holder<Game> theGame = new Holder<>();
...

theGame.hold(myGame);
...
{
// Access the game through the `final Holder`
theGame.held() ....

关于Java8- "effectively final",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26163645/

25 4 0
文章推荐: java - map 和 concurrentHashMap 的线程安全
文章推荐: javascript - jQuery:将