我正在尝试使用Scala创建一个带有MenuBar的Vaadin窗口。我收到一个编译器错误,指示无法找到com.vaadin.ui.MenuBar.MenuItem导入。我看过Vaadin图书馆(6.4.8),似乎课程就在那里:
com/vaadin/ui/MenuBar$Command.class
com/vaadin/ui/MenuBar$MenuItem.class
com/vaadin/ui/MenuBar.class
以下是MenuBar源代码的类结构:
@SuppressWarnings("serial")
@ClientWidget(value = VMenuBar.class, loadStyle = LoadStyle.LAZY)
public class MenuBar extends AbstractComponent {
...
public interface Command extends Serializable { ... }
public class MenuItem implements Serializable { ... }
}
出于演示目的,这里有一个示例Scala类:
import com.vaadin.Application
import com.vaadin.ui.Button
import com.vaadin.ui.Window
import com.vaadin.ui.MenuBar
import com.vaadin.ui.MenuBar.Command
import com.vaadin.ui.MenuBar.MenuItem
class MyVaadinApplication extends Application
{
private var window : Window = null
override def init() =
{
window = new Window("My Scala Vaadin Application")
setMainWindow(window)
window.addComponent(new Button("Click Me"))
}
}
这是我尝试编译时产生的错误:
/Users/jstanford/Development/NetBeansProjects/TraderDashboard/src/main/scala:-1: info: compiling
Compiling 2 source files to /Users/jstanford/Development/NetBeansProjects/TraderDashboard/target/classes at 1291973683915
[ERROR]MyVaadinApplication.scala:7: error: MenuItem is not a member of com.vaadin.ui.MenuBar
import com.vaadin.ui.MenuBar.MenuItem
^
有人能在这里发现问题吗?
谢谢, 约翰
答案 0 :(得分:4)
内部类不能像往常一样导入它适合Java。只需为Button#ClickEvent类型指定类型投影:
import com.vaadin._
import ui._
import Button._
class MyScalaVaadinApplication extends Application {
val window = new Window("My Vaadin Application")
def init {
window.addComponent(new Button("Click Me", new ClickListener {
def buttonClick(clickEvent: Button#ClickEvent): Unit = window.showNotification("Just a message")
}))
setMainWindow(window)
}
}
答案 1 :(得分:1)
一个非常简单的例子,显示正在发生的事情。
爪哇:
package a;
public class Outer { public class Inner {} }
Scala的:
import a.Outer
import a.Outer.Inner // causes *Inner is not a member of a.Outer*
请注意, Inner ,如 MenuBar.MenuItem ,是一个非静态内部类,因此与 Outer 的一个实例相关联。但是Scala允许我们使用 Outer 的实例导入 Inner :
import a.Outer
import a.Outer.Inner
object dummy {
val o = new Outer
val o2 = new Outer
import o.Inner
val i = new Inner
val i2 = new o2.Inner
}
如果我们可以import a.Outer.Inner
编译器如何知道外部的内部属于哪个实例?
希望问题已经解决。