我正在为学校的Battleship游戏分发版本(rmi)。在游戏中,每个玩家都有一个舰队和一个网格,所以我希望能够使用迭代器来编写代码
T: ValueReader
但是我的班级ArbitraryTypeReader
也需要是一个远程班级,所以我有类似的东西
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()
所以我有两个问题:
谢谢!
Ps:我知道我可以通过其他方式在客户端列表中使用迭代器,但是这个错误让我想知道是否可以与Remote一起实现其他接口。
答案 0 :(得分:1)
implements Remote
这已经错了。您必须定义自己的远程接口,扩展 Remote
,并实现 。我怀疑这是导致问题的原因。你根本没有任何实际的远程方法。事实上UnicastRemoteObject
已经实现了Remote
。
您的问题的答案是:
除非Player
是服务器端的本地对象,否则您的代码没有意义。是这样吗。
编辑您的编辑错误:
interface IFleet extends Remote, Iterable<IShip> {...}
class Fleet extends UnicastRemoteObject implements IFleet {...}
远程接口只能包含远程方法,并且必须声明它们抛出RemoteException
,这就是您收到错误消息的原因:Iterable
don&#的方法39;扔掉RemoteException
。
因此,您的远程接口必须扩展Remote
,而不扩展Iterable
。如果你想将它隐藏在客户端之外,它无论如何都没有意义。必须实施 Iterable
的远程对象。
我也试过
interface IFleet extends Remote {...}
class Fleet extends UnicastRemoteObject implements IFleet, Iterable<IShip> {...}
这是你唯一应该尝试的东西。它有效,它满足你的问题(2)。