我试图从只有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中工作)。
如何最好地解决问题?也许正确的答案是只定义一个单独的,无关的对象。
答案 0 :(得分:2)
我不认为有一个很好的方法来做你想做的事情:
SWT.X
而不是X
引用字段)这是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}
如果没有别的,那么常量来自何处就更清楚了。在那里,我说自己相信这更好:)。