Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Jython中,我可以创建一个实现Java接口的内联匿名类吗?_Java_Jython_Anonymous Class - Fatal编程技术网

在Jython中,我可以创建一个实现Java接口的内联匿名类吗?

在Jython中,我可以创建一个实现Java接口的内联匿名类吗?,java,jython,anonymous-class,Java,Jython,Anonymous Class,在Java中,我可以说 Thread t = new Thread(){ public void run(){ // do stuff } } (或者类似的)内联声明匿名类。这对于创建事件处理程序或其他回调类型的东西非常有用,这些东西首先是用任何合理的语言编写的 我在Jython中也面临同样的问题——我想定义一个事件处理程序,但我不想构建一个完整的独立类来实现这一点 理想情况下,我只能通过lambda并完成它,但如果这是可能的,我在文档中的任何地方都找不到它。以下是我原始答案的背景阅读

在Java中,我可以说

Thread t = new Thread(){
    public void run(){ // do stuff }
}
(或者类似的)内联声明匿名类。这对于创建事件处理程序或其他回调类型的东西非常有用,这些东西首先是用任何合理的语言编写的

我在Jython中也面临同样的问题——我想定义一个事件处理程序,但我不想构建一个完整的独立类来实现这一点


理想情况下,我只能通过lambda并完成它,但如果这是可能的,我在文档中的任何地方都找不到它。

以下是我原始答案的背景阅读链接:

请阅读以下内容:

然后,阅读以下内容:

最后,请阅读以下内容:

[对原始ANSER的改进]

Jython在适当时隐式地将函数转换为事件处理程序。因此,您可以在其中一个方法中编写以下内容:

def _(self, event):
    print 'Cancel button was clicked!'
    if self.task is not None:
        self.task.cancel()
cancelButton.setOnAction(lambda event: _(self, event))
这种方法提供了匿名内部类的三个理想特性

(1) 它是高度本地化的。处理程序代码位于分配处理程序的代码旁边

(2) 它是自我感知的,这意味着您拥有
自我
,并且可以访问包含对象的所有成员

(3) 它(几乎)是匿名的。Python迫使我为多行函数选择一个名称,但它也允许我重用该名称。因此,只要我立即使用它们,我就可以定义任意多个名为
\uuu
的本地函数。(用相同的名称定义第二个函数会使第一个函数无法用该名称访问。)因此,我不必无限地发明唯一的名称

您还可以将此模式打包到装饰器中,我认为这稍微澄清了其意图:

@LocalEventHandler(self, cancelButton.setOnAction)
def _(self, event):
    print 'Cancel button was clicked!'
    if self.task is not None:
        self.task.cancel()
装饰器实现如下所示:

class LocalEventHandler(object):
    '''This decorator turns a local function into a *self aware* event handler.'''

    def __init__(self, context, assignHandlerFunc):
        self.context = context
        self.assignHandlerFunc = assignHandlerFunc

    def __call__(self, handler):
        self.assignHandlerFunc(lambda event: handler(self.context, event))
        return handler

大卫:这正是我要问的,如果你能回答我的问题,我会接受的。谢谢潜在问题:我尝试了这种方法,通过
ReadOnlyObjectProperty.addListener()
向添加
ChangeListener
。但是,
addListener()
被重载,Jython选择了“错误的”重载函数。我最终得到的是一个
invalizationListener
,而不是
ChangeListener