Почему этот простой пример 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()".
"Как это исправить?"
Уточните, чего вы пытаетесь достичь.