Почему этот простой пример 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

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


ОБНОВИТЬ:

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам