我正在开发学校游戏战舰的分布式版本(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> {...}
<小时/>
所以我有两个问题:
- 远程对象能否仅实现 Remote 及其子接口(interface)?
- 我能否以某种方式从 rmi 客户端隐藏远程对象中的方法(使它们不可用,从而允许它们不尊重远程接口(interface)需求)?
谢谢!
Ps:我知道我可以以其他方式在客户端中的列表上使用迭代器,但是这个错误让我想知道是否可以与 Remote 一起实现其他接口(interface)。
最佳答案
implements Remote
这已经是错误的了。您必须定义自己的远程接口(interface),扩展 Remote
,并实现该。我怀疑这是造成问题的原因。您的类中根本没有任何实际的远程方法。事实上,UnicastRemoteObject
已经实现了 Remote
。
您的问题的答案是:
- 远程对象可以实现它喜欢的任何接口(interface),无论是远程接口(interface)还是其他接口(interface)。
- 如果它们没有出现在您的远程界面中,则它们已经被隐藏。
除非 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/