Инициализация массива с различными типами данных - PullRequest
0 голосов
/ 25 марта 2020

Я играл с kotlin функциями, особенно выводом типов данных в массиве. Все примеры, которые я видел, были такими:

val wordArray = arrayOf("empowered", "leveraged", "aligned", "targeted")
val intArray = arrayOf(1, 2, 3, 4)

Но также возможно что-то вроде:

val myObjectArray = arrayOf(2, "Dos", 2.2F)

Итак, вы можете разделить массив элементов, где каждый элемент имеет другой тип. Вы можете работать с этими элементами:

val newPhrase = "myObjectArray[0] = ${myObjectArray[0]}, " +
            "myObjectArray[1] = ${myObjectArray[1]}, " +
            "myObjectArray[2] = ${myObjectArray[2]}"
println(newPhrase)
for(item in myObjectArray){
     println(item.javaClass.toString())
}

, которые выдают в консоли вывода:

myObjectArray[0] = 2, myObjectArray[1] = Dos, myObjectArray[2] = 2.2 
class java.lang.Integer 
class java.lang.String 
class java.lang.Float

Я также проверил некоторые глупости, такие как:

myObjectArray[0] = 4.4       // It doesn't compile
myObjectArray[1] = 'c'       // It doesn't compile
myObjectArray[1] = 4         // It compiles
myObjectArray[1] = 4.4      // It doesn't compile
myObjectArray[2] = 4        // It compiles
myObjectArray[2] = "cadena" // It compiles   
myObjectArray[2] = 4L       // It doesn't compile

И вывод скомпилированных строк:

myObjectArray[0] = 2, myObjectArray[1] = 4, myObjectArray[2] = cadena
class java.lang.Integer
class java.lang.Integer
class java.lang.String

Если вы хотите ограничить конкретным типом данных, скажем, байтами, он должен быть объявлен как:

var byteArray1 = byteArrayOf(1,2,3)
var byteArray2:Array<Byte> = arrayOf(1,2,3)

Идет Кстати, мои вопросы:

  1. Почему можно объявить массив с различными типами элементов?
  2. Что такое преимущество?
  3. Если есть какие-либо преимущества, почему это не объясняется? Я читаю ссылки, такие как kotlin документация, First Head Kotlin и некоторые Kotlin блоги. Никто из них не упоминает об этой опции кода.

Я ценю ваши разъяснения. Заранее спасибо.

РЕДАКТИРОВАТЬ:

Как говорит @ Tenfour04 , компилятор компилирует код. Так что проблема в IntelliSense IntelliJ IDEA:

enter image description here

Итак, можно создать массив с любым типом объекта и установить его положение с любым другим объектом.

Ответы [ 2 ]

2 голосов
/ 25 марта 2020

Возможно, вы захотите проверить свой код еще раз. Все эти различные типы объектов могут быть добавлены в массив очень хорошо .

Когда вы используете arrayOf без указания типа, он выводит общий тип всех объектов, которые вы положили in. Единственный общий тип для Ints, Strings и Floats - Any, поэтому результирующий массив - Array<Any>. Это просто базовое поведение вывода типа, так что ваши три вопроса на самом деле не применимы. Вариант использования для Array<Any> может быть редким, но он существует, и компилятору нет причин его запрещать.

0 голосов
/ 25 марта 2020

Если вы хотите использовать массив другого типа, вы используете концепцию полиморфизма. Все классы являются подклассами Any (как Object в Java). Вот почему то, что вы сделали, сработало. Это полезно, когда вам нужно хранить разные подклассы в одном массиве. Например, массив Instrument может содержать Violin, Guitar и др. c. Недостатком является проверка экземпляра класса и приведение класса.

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