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