Нет, они не делают одно и то же.
.toXxx()
методы преобразовывают значение из одного типа в другой. Это может быть дистанционно связанный тип (например, List
до String
) или тесно связанный тип (например, Int
до Float
), но во всех случаях это разные типы, и они имеют разные значения .
as
, однако, является cast . Приведение не преобразует значение в требуемый тип; приведение обещает компилятору, что значение уже необходимого типа. Если это не так, вы обнаружите ошибку, как вы обнаружили.
Языки, такие как C и Java довольно слабы в отношении числительных c типов и автоматически конвертируются между ними во многих обстоятельствах («числительное c продвижение»), что может быть причиной того, что вы путаете их. Это может быть довольно удобно; но это также может привести к тонким ошибкам. Таким образом, Kotlin делает намного меньше, обеспечивая дополнительную безопасность (что является одной из тем языка).
(Эта путаница кажется довольно распространенной; см., Например, этот вопрос только от 4 дня go.