Bawiłem się z funkcjami Kotlin, szczególnie, wnioskowaniem typów danych w tablicy. Wszystkie przykłady, które widziałem, były jak:

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

Ale możliwe jest też coś:

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

Można więc zadeklarować tablicę elementów, gdzie każdy element ma inny typ. Możesz pracować z tymi przedmiotami:

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

Który wytwarza w konsoli wyjściowej:

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

Sprawdziłem też jakieś głupie rzeczy, takie jak:

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

A produkcja skompilowanych linii to:

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

Jeśli chcesz ograniczyć konkretny typ danych, powiedzmy, że bajty, należy go ogłosić jak:

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

Chodzenie do punktu moje pytania to:

  1. Dlaczego można zadeklarować tablicę z różnymi typami przedmiotów?
  2. Jaka jest zaleta?
  3. Jeśli istnieje jakaś przygoda, dlaczego nie jest to wyjaśnione? Czytałem referencje, takie jak dokumentacja Kotlin, pierwsza głowa Kotlin, a niektóre blogi Kotlin. Żaden z nich nie ma żadnego odniesienia na temat opcji tego kodu.

Doceniam twoje wyjaśnienia. Z góry dziękuję.

EDYTUJ:

Jako @ Tenfour04 mówi, że kompilator kompiluje kod. Problemem jest więc idealny pomysł Intellij:

enter image description here

Możliwe jest więc utworzyć tablicę z dowolnym obiektem i ustawić jego pozycję z dowolnym innym obiektem.

0
No More Hello World 25 marzec 2020, 19:36

2 odpowiedzi

Najlepsza odpowiedź

Możesz ponownie sprawdzić swój kod. Wszystkie te różne typy obiektów można dodać do tablicy W porządku.

Kiedy używasz arrayOf bez określania typu, napisze wspólny typ wszystkich umieszczanych obiektów }. To tylko podstawowe zachowanie wnioskowania typu, więc trzy pytania nie mają zastosowania. Przypadek użycia dla Array<Any> może być rzadki, ale istnieje i nie ma powodu, aby kompilator mógł go zabraniać.

2
Tenfour04 25 marzec 2020, 18:00

Jeśli chcesz użyć tablicy z innym typem, używasz pojęcia polimorfizmu. Wszystkie klasy są podklasą każdego (jak obiekt w Javie). Dlatego, co zrobiłeś, pracowałeś. Jest przydatny, gdy trzeba przechowywać inną podklasę w jednej tablicy. Na przykład, tablica instrumentu może zawierać skrzypce, gitarę i itp. Wadą jest kontrola instancji klasy i odlewania klasy.

1
Madina Saidova 25 marzec 2020, 16:46