Почему этот простой пример scala не может быть скомпилирован?

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

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


UPDATE:

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

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

Ответ 1

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

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

Счастливое кодирование.

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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