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

时间:2015-11-19 22:00:37

标签: 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定义,那么这很好,但是您需要can't easily extend个对象阶。

我发现隐含 a la pimp my library可能是要走的路,但即使我要让它工作,我认为解决方案无法从Java(仍然,我甚至没有在Scala中工作)。

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

2 个答案:

答案 0 :(得分:2)

我不认为有一个很好的方法来做你想做的事情:

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

这是Scala的文档限制 - 请参阅access java base class's static member in scala

此外,我也不认为隐式路由有效,因为您不能将Java类视为值:How to access a Java static method from Scala given a type alias for that class it resides in

执行您想要的操作的最佳方式可能是在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)

答案 1 :(得分:0)

我接受yuzeh的彻底性,普遍适用性和乐于助人的答案,但这是我实际做的,略有不同:

为了统一,yuzeh的最后一个建议让我非常感动,即

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

虽然我上面的第一个示例代码段无意中显示,SWT.None遗憾的是 ,因此将其置于本地命名空间会与Option的冲突无效。

我想现在我只是导入:

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

如果没有别的,那么常量来自何处就更清楚了。在那里,我说自己相信这更好:)。