Почему этот простой пример scala не может быть скомпилирован? - PullRequest
0 голосов
/ 04 марта 2011
class X extends Map[String, String] {
    def x(): X = { X() } // can't be compiled
}

не может быть скомпилировано, ошибка:

<console>:6: error: not found: value X
def x(): X = { X() } // can't be compiled

Почему Х не найден? Я не вижу, как это исправить.


UPDATE:

Теперь я знаю причину. Я хочу создать класс, который расширяет HashMap, поскольку Map() вернет экземпляр HashMap, поэтому я подумал, что могу просто расширить Map. Теперь правильный код должен быть:

import scala.collection.immutable.HashMap
class X extends HashMap[String, String] {
    def x(): X = { new X() }
}

Ответы [ 3 ]

13 голосов
/ 04 марта 2011

Могу ли я порекомендовать вам попробовать другой подход?

Расширение библиотеки коллекций - одна из самых продвинутых вещей, которые вы можете сделать в Scala. Для правильного выполнения работы вам необходимо глубокое понимание типов более высокого класса, умозаключений, дисперсии, последствий и механизма CanBuildFrom. Это не легкомысленное задание, которое может взять на себя новичок.

С другой стороны, невероятно редко вам когда-либо понадобится расширить коллекцию.

Вернемся к первым принципам ... Какую проблему вы пытаетесь решить, для которой, по вашему мнению, правильным подходом является расширение HashMap? Я могу практически гарантировать, что в Scala есть гораздо лучший способ сделать это.

ОБНОВЛЕНИЕ Mk.II

Этот ответ ранее содержал описание логики структуры CanBuildFrom. Следуя предложению @ soc, я перенес эту часть ответа на вопрос FAQ здесь

4 голосов
/ 04 марта 2011

Попробуйте new X() вместо X() - вы получите еще одну ошибку, но я верю, что вы на правильном пути.

В последнем случае он пытается вызвать applyпри выражении , обозначенном X (например, представьте себе, где X определяется как object X или val X), а не , пытаясь вызвать конструктор для класса X.

Удачного кодирования.

1 голос
/ 04 марта 2011

Непонятно, что вы пытаетесь сделать, но причина, по которой он не компилируется, состоит в том, что нет поля, функции или метода, называемого «X», и нет модуля «X» с «apply»).'method.

"Как это исправить?"

Уточните, чего вы пытаетесь достичь.

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