我有一个SwingWorker类,如下所示:
class RemotePlayersWorker extends SwingWorker<String[][], Object> {
PlayerCanvas parent;
RemoteHandler remote;
String[][] players;
int maximumConnections;
public RemotePlayersWorker(PlayerCanvas parentCanvas, RemoteHandler remoteHandle) {
this.parent = parentCanvas;
this.remote = remoteHandle;
}
@Override
protected String[][] doInBackground() throws Exception {
System.out.println("TEST 1");
players = remote.getConnectedPlayers();
publish(players);
return players;
}
@Override
protected void process(List<String[][]> chunks) {
for (String[][] chunk : chunks) {
// no need for the c variable
System.out.println(chunk.toString());
}
}
@Override
protected void done() {
}
}
但是,我在覆盖进程(List chunks)方法时遇到错误。 Eclipse告诉我这个:
The method process(List) of type PlayerHandler.RemotePlayersWorker must override or implement a supertype method
但是,据我所知,我正确地覆盖了该方法 - 无论我将列表类型设置为什么,我都会得到相同的错误。
还有其他原因我无法覆盖process()吗?
我正在使用java版“1.7.0_10” - Java(TM)SE运行时环境(版本1.7.0_10-b18)
答案 0 :(得分:7)
SwingWorker类定义如下:
public class SwingWorker<T, V> {
...
protected void process(List<V> chunks) {
...
}
}
所以,因为你的子类被声明为
class RemotePlayersWorker extends SwingWorker<String[][], Object> {
流程方法应该以{{1}}为参数,而不是List<Object>
答案 1 :(得分:4)
您的process()
方法中的参数应该是
protected void process(List<Object> chunks) {
/// do your stuff
}
需要第二名。 SwingWorker
类的通用数据类型。请阅读documentation。
public class SwingWorker<T, V> {
// methods
protected void process(List<V> chunks) {
// do your stuff
}
}
在这里,您可以更清楚地看到process()
方法需要 V
({1}}。
因此要么将其更改为Object
,要么反转您的SwingWorker类签名(但是您需要更改doInBackground()方法的返回类型)。
答案 2 :(得分:3)
您对流程方法的理解是错误的。
SwingWorker的签名:protected void process(List<V> chunks)
V - 用于执行中间结果的类型 SwingWorker的发布和处理方法
所以它应该是:
protected void process(List<Object> chunks)