如何丰富具有静态方法的Java库类(又称Scala中的对象)



我正试图从只有static final成员的java库(SWT)中扩展一个类(SWT.java)。摘录自图书馆课程:

package org.eclipse.swt;
import org.eclipse.swt.internal.*;
public class SWT {
    public static final int None = 0;
    // ...
    public static final int MouseDown = 3;
    // ...
}

我的Java包装器类在Java领域运行良好:

public class SWT extends org.eclipse.swt.SWT {
    public static final int FinalizeText = 201;
    public static final int ParseText = 202;
}

现在,如果我尝试在Scala中使用我的新SWT类,我会得到这样的错误:

Error:(198, 27) value MouseDown is not a member of object my.package.SWT
    table.addListener(SWT.MouseDown, periodEditListener)
                          ^

理想情况下,我想要一个新的SWT对象,用它我可以访问原始成员(例如MouseDown)和我定义的成员(例如,FinalizeText)。

Scala似乎把这个类的所有有用的东西都解释为一个对象,如果我们只想使用原始的SWT定义,这很好,但你不能在Scala中轻松地扩展对象。

我突然想到,implicitsa la可能是我的库,但即使我让它发挥作用,我认为Java也无法访问该解决方案(尽管如此,我甚至还没有进入Scala工作)。

如何最好地解决这个问题?也许正确的答案是定义一个单独的、不相关的对象。

我认为没有一个好的方法可以做到你想要的:

  • 您可以将所有成员整齐地绑定到一个标识符(即通过SWT.X而不是X引用字段)
  • 让它在Scala和Java中都能工作
  • 您不必手动转发字段

这是Scala的一个文档限制——请参阅access java基类';s scala中的静态成员。

此外,我认为隐式路由也不起作用,因为你不能将Java类视为一个值:如何从Scala访问Java静态方法,为它驻留在中的类提供一个类型别名

可能最好的方法是手动转发my.package.SWT:中所需的静态成员

public class SWT extends org.eclipse.swt.SWT {
    public static final int FinalizeText = 201;
    public static final int ParseText = 202;
    public static int getMouseDown() {
        return MouseDown;
    }
}

如果您只关心自动转发成员而不关心其他要求,则可以使用import:

import org.eclipse.swt.SWT._
table.addListener(MouseDown, periodEditListener)

我接受yuzeh关于彻底性、普遍适用性和有用性的回答,但以下是我实际做的,略有不同:

为了统一起见,我被尤泽的最后一个建议所吸引,即

import org.eclipse.swt.SWT._
import my.package.SWT._

尽管正如我上面的第一个示例片段无意中显示的那样,SWT.None不幸的是,因此将其带入本地命名空间将与Option的None冲突。

我想现在我只会进口像:

import org.eclipse.swt.SWT
import my.package.{SWT => MySWT}

如果没有别的,常数的来源就更清楚了。在那里,我说服自己相信这会更好:)。

最新更新