匿名类如何有参数?

时间:2011-12-06 15:59:42

标签: java class interface anonymous

我不是一个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);

第二行会弹出错误。帮助?!?

4 个答案:

答案 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是一个接口,而不是一个类,它根本没有构造函数,所以肯定没有接受参数。

那就是说,无论那些应该是什么,它们都没有在匿名类的主体中使用,所以对于第一个近似,你想要完全放弃括号内的内容。