我正试图从只有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}
如果没有别的,常数的来源就更清楚了。在那里,我说服自己相信这会更好:)。