我不是一个java人,但我继承了一些我需要补丁的代码。我将源代码转换为netbeans并且我收到错误:匿名类实现接口;不能有参数。
以下是代码:
Executor background = Executors.newSingleThreadExecutor();
Runnable mylookupThread = new Runnable(FilePath, SearchIndex)
{
public void run()
{ MainWindow.this.processFile(this.val$FilePath);
Thread t = new Thread(new lookupThread(MainWindow.arrFile, true, false, this.val$SearchIndex));
t.setName("Lookup");
t.setPriority(10);
t.start();
}
};
background.execute(mylookupThread);
Executor statusThread = Executors.newSingleThreadExecutor();
Runnable myStatusThread = new Runnable()
{
public void run()
{ MainWindow.this.updateStatus();
}
};
statusThread.execute(myStatusThread);
第二行会弹出错误。帮助?!?
答案 0 :(得分:3)
将mylookupThread
分开,将其作为实例并将其传递给Executor
:
class LookupTask implements Runnable {
private final String filePath, searchIndex;
LookupTask(String filePath, String searchIndex) {
this.filePath = filePath;
this.searchIndex = searchIndex;
}
public void run() { ... }
}
...
background.execute(new LookupTask(filePath, searchIndex));
其他方法是让filePath, searchIndex
最终:
final String filePath = ...
final String searchIndex = ...
Executor background = Executors.newSingleThreadExecutor();
Runnable mylookupThread = new Runnable() {
public void run() { MainWindow.this.processFile(filePath);
Thread t = new Thread(new lookupThread(MainWindow.arrFile, true, false, searchIndex));
t.setName("Lookup");
t.setPriority(10);
t.start();
}
};
background.execute(mylookupThread);
答案 1 :(得分:1)
new -interface形式的匿名类隐式扩展了Object。您必须使用其中一个constructors for Object。只有一个 - 无参数构造函数。
答案 2 :(得分:1)
@Victor是对的,你可以创建另一个类。您还可以在匿名类中使用final
的变量。以下内容将起作用。
Executor background = Executors.newSingleThreadExecutor();
private final FilePath filePath = ...;
private final String searchIndex = ...;
Runnable mylookupThread = new Runnable() {
public void run() {
MainWindow.this.processFile(filePath);
Thread t = new Thread(new lookupThread(MainWindow.arrFile, true, false,
searchIndex));
t.setName("Lookup");
t.setPriority(10);
t.start();
}
};
顺便说一下。在执行程序中执行的线程的Runnable
内创建一个线程有点奇怪。不确定为什么你不会直接生成LookupThread
并完全删除匿名类。
答案 3 :(得分:0)
这是问题界面(正如你所说:)
Runnable mylookupThread = new Runnable(FilePath, SearchIndex) { ...
正在发生的事情是我们正在动态定义一个类,并且该类实现了Runnable
接口。使用此语法时,括号中的项目将用作超类的构造函数参数。由于Runnable
是一个接口,而不是一个类,它根本没有构造函数,所以肯定没有接受参数。
那就是说,无论那些应该是什么,它们都没有在匿名类的主体中使用,所以对于第一个近似,你想要完全放弃括号内的内容。