Ошибка класса импорта Scala - PullRequest
1 голос
/ 09 января 2012

Возникли проблемы с импортом в Scala. У меня проблема с импортом двух классов. Первый:

package org.world
import org.gui.tokens.Token


object WorldObject {

}

abstract class WorldObject[A <: WorldObject[_]](var xPos: Float, var yPos: Float) {
  def x = xPos
  def y = yPos

  def token: Token
             ^^^^^
  def move(dx: Float, dy: Float) {// : A = new A(x + dx, y + dy)
    xPos += dx // = x + dx
    yPos += dy
  }
}

и второй:

package org.gui.tokens

object Token {

}

И проблема в том, что тип возвращаемого значения def token: Token подчеркнут красным цветом с ошибкой, говорящей

не найдено: введите токен

Все хорошо с местоположениями класса. Другие классы не имеют подобных проблем. Я не помню такой ситуации в Java, автоимпорт всегда работал отлично. Здесь он только снова и снова добавляет оператор import org.gui.tokens.Token в файл WorldObject ... почему? Что я могу с этим поделать?

Ответы [ 3 ]

7 голосов
/ 09 января 2012

Token - это объект, поэтому выражение def token: Token имеет для компилятора столько же смысла, сколько выражение def token: 5 или def token: "Hello".

.

Вы имеете в виду def token = Token, если хотите вернуть объект Token; или вы имеете в виду class Token {}; object Token extends Token {} в вашем файле токенов, так что действительно существует класс с именем Token, или вы имеете в виду def token: Token.type, что означает, что метод должен возвращать что-то типа объекта Token. (Но в этом нет особого смысла, поскольку объект Token - это единственное, что имеет тип Token.type.)

2 голосов
/ 09 января 2012

Прежде всего, «подчеркнутый красным» означает, что вы спрашиваете об определенной IDE для Scala (Eclipse, IDEA?).

object Token является одноэлементным объектом, нет общего типа Token, который мог бы быть создан! Существует ровно один объект, поэтому def token: Token неверно предполагает, что могут быть разные токены. Вы можете исправить это двумя способами. Сначала с помощью синглтона типа Token:

def token: Token.type

или, поскольку существует только один способ вернуть такой объект, вы уже можете предоставить реализацию:

def token: Token.type = Token

или короткий

def token = Token

Однако польза от этого сомнительна. Любой, кто ищет объект Token, может напрямую с ним поговорить, вместо косвенного обращения к методу.

1 голос
/ 10 января 2012

Ваша проблема не с пакетами, а с объектами.

Вы пометили токен как объект, а не как класс.Это было бы похоже на пометку каждого метода в классе Java статическим, но в Scala нет шансов на объявление.

    package org.gui.tokens
    class Token {
    }

Помните, потому что объекты имеют только один экземпляр и не могут быть расширены, они не могутиспользоваться в качестве идентификаторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...