gpt4 book ai didi

java - 远程对象实现中的非远程方法

转载 作者:行者123 更新时间:2023-11-30 06:23:08 24 4
gpt4 key购买 nike

我正在开发学校游戏战舰的分布式版本(rmi)。在游戏中,每个玩家都有一个舰队和一个网格,所以我希望能够使用迭代器来编写这样的代码

class Fleet implements Iterable<Ship> {

private List<Ship> fleet;
...
@Override
public Iterator<Ship> iterator() { return fleet.iterator(); }
}

class Player {

private Fleet fleet;
...
public void placeFleet() {
for (Ship s : fleet) {
...
}
}
}

但是我的类Fleet也需要是一个远程类,所以我有这样的东西

interface IFleet extends Remote, Iterable<IShip> {...}

class Fleet extends UnicastRemoteObject implements IFleet {...}

但是,这会导致错误,因为 iterator() 方法不是远程方法,即我遇到 illegal Remote Method Been: public Abstract java.util.Iterator java.lang。 Iterable.iterator()

我也尝试过

interface IFleet extends Remote {...}

class Fleet extends UnicastRemoteObject implements IFleet, Iterable<IShip> {...}
<小时/>

所以我有两个问题:

  1. 远程对象能否仅实现 Remote 及其子接口(interface)?
  2. 我能否以某种方式从 rmi 客户端隐藏远程对象中的方法(使它们不可用,从而允许它们尊重远程接口(interface)需求)?

谢谢!

Ps:我知道我可以以其他方式在客户端中的列表上使用迭代器,但是这个错误让我想知道是否可以与 Remote 一起实现其他接口(interface)。

最佳答案

implements Remote

这已经是错误的了。您必须定义自己的远程接口(interface),扩展 Remote,并实现。我怀疑这是造成问题的原因。您的类中根本没有任何实际的远程方法。事实上,UnicastRemoteObject 已经实现了 Remote

您的问题的答案是:

  1. 远程对象可以实现它喜欢的任何接口(interface),无论是远程接口(interface)还是其他接口(interface)。
  2. 如果它们没有出现在您的远程界面中,则它们已经被隐藏。

除非 Player 是服务器端的本地对象,否则您的代码没有意义。是这样吗。

编辑您的编辑也是错误的:

interface IFleet extends Remote, Iterable<IShip> {...}

class Fleet extends UnicastRemoteObject implements IFleet {...}

远程接口(interface)只能包含远程方法,并且必须声明它们抛出RemoteException,这就是您收到错误消息的原因:Iterable 的方法 不要抛出RemoteException

因此,您的远程接口(interface)必须扩展Remote,并且不能扩展Iterable。如果你想向客户隐瞒这一点,无论如何这是没有意义的。远程对象必须实现Iterable

I've also tried with

interface IFleet extends Remote {...}

class Fleet extends UnicastRemoteObject implements IFleet, Iterable<IShip> {...}

这是你唯一应该尝试的事情。它有效,并且满足您的问题 (2)。

关于java - 远程对象实现中的非远程方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47732619/

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