Когда вы можете использовать оператор «как»? - PullRequest
0 голосов
/ 08 октября 2018

У меня есть следующая программа:

fun main(args: Array<String>) {
    var a: Int
    var b = 23.5
    a = b as Int
    println(a)
}

Если я запускаю ее, программа выдает исключение java.lang.ClassCastException.

Поскольку типы данных, используемые в Kotlin, представлены как объекты,Я могу понять, почему невозможно легкомысленно разыграть их, как у меня, и вместо этого следует использовать встроенные методы преобразования, связанные с каждым типом, или «безопасный» оператор as? - но тогда возникает вопрос: когда можно(или должны) вы используете оператор as?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

В вашем примере b - это значение Double с плавающей точкой, а не Int.(Как указали другие ответы.) Чтобы преобразовать его, вам нужно использовать что-то вроде b.toInt().

Ваша программа не преобразует его, потому что оператор as Котлина не делает 't изменить значение на новый тип;вместо этого он сообщает компилятору, что значение уже требуемого типа. Это называется cast .

Так, например, если у меня есть:

val n: Number = 4

Тогда тип n равен Number.Его текущим значением на самом деле является Int (который является подклассом Number).Так что в этом случае я могу привести его к Int, например:

val i = n as Int

, после чего компилятор обработает как Int.

(Этот частный случай - понижающий , потому что Int ниже Number в иерархии классов. В целом, повышающие значения безопасны, но понижающие и другие нет. Если у вас быловместо этого инициализируется n числом с плавающей запятой, тогда его значение будет иметь тип Double, который является другим подклассом Number, а не Int; программа завершится с ошибкой во время выполнения и выдастClassCastException, как вы видели. Вот почему у Kotlin также есть оператор безопасного приведения, as?, который дает ноль вместо исключения.)

Компилятор Kotlin очень умен, и большую часть временион уже знает, какой тип может быть значением, поэтому приведение не требуется очень часто.Все еще могут быть случаи, когда вы знаете что-то, чего нет у компилятора, и приведение типа подходит;но слишком многие из них могут быть «запахом кода», указывающим, что может быть лучший подход.

0 голосов
/ 08 октября 2018

Умные приведения компилятора Kotlin довольно умны, поэтому в большинстве случаев вам не нужно явное приведение.Этот код в Java:

Object foo = "foo";
if (foo instanceof String) {
  String fooString = (String) foo;
  System.out.println(fooString.length);
}

будет переводиться в этот код Kotlin:

val foo: Any = "foo"
if (foo is String) {
  println(foo.length)
}

Однако, as и as? по-прежнему актуальны, например:

fun test(foo: Any) {
  val fooString = foo as? String ?: throw IllegalArgumentException()
  ...
}

В целом, полагайтесь на умные приведения как можно чаще и оставляйте as и as? для особых случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...