なぜScalaはcom.vaadin.ui.menubar.menuitemを認識しないのですか
質問
Scalaを使用してメノバーを使用してVaadinウィンドウを作成しようとしています。 com.vaadin.ui.menubar.menuitemのインポートが見つからないことを示すコンパイラエラーがあります。 Vaadin Library(6.4.8)を見ましたが、クラスはそこにあるようです。
com/vaadin/ui/MenuBar$Command.class
com/vaadin/ui/MenuBar$MenuItem.class
com/vaadin/ui/MenuBar.class
これがメノバーのソースからのクラス構造です:
@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
^
誰かがここで問題を見つけることができますか?
ありがとう、ジョン
解決
内部クラスは通常どおりインポートすることはできません。これはJavaに適しています。ボタン#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)
}
}
他のヒント
何が起こっているかを示す非常に簡単な例。
Java:
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*
それに注意してください 内側, 、 お気に入り menubar.menuitem, 、非静的な内部クラスであり、そのようにの1つのインスタンスに関連付けられています 外側. 。しかし、Scalaはインポートすることを可能にします 内側 のインスタンスを使用します 外側:
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
コンパイラはどのインスタンスをどのように知っていますか 外側 は 内側 所属するはずですか?
問題がクリアされたことを願っています。
所属していません StackOverflow