почему scala не распознает com.vaadin.ui.MenuBar.MenuItem - PullRequest
0 голосов
/ 10 декабря 2010

Я пытаюсь создать окно Vaadin с MenuBar, используя Scala.Я получаю ошибку компилятора, которая указывает на то, что импорт 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
       ^

Может кто-нибудь заметить проблему здесь?

Спасибо, Джон

Ответы [ 2 ]

4 голосов
/ 10 декабря 2010

Внутренние классы не могут быть импортированы, как обычно, это подходит для 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 голос
/ 10 декабря 2010

Очень простой пример, показывающий, что происходит.

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*

Обратите внимание, что Inner , как и MenuBar.MenuItem , является нестатическим внутренним классом и поэтому связан с одним экземпляром Outer . Но Scala позволяет нам импортировать Inner , используя экземпляр Outer :

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 как бы компилятор узнал, какому экземпляру Outer соответствует Inner , который должен принадлежать?

Надеюсь, что проблема была устранена.

...