Jason. Cała informatyka w jednym miejscu!

Idziemy dalej z koksem! Przedstawię Wam teraz jak wygląda sprawa z rzutowaniem typu. Co powiecie na słowo kluczowe "is" w języku Kotlin, które w pewnych sytuacjach może to zrobić za Was, a Wasza rola sprowadzi się tylko do instrukcji warunkowej, co? Jeśli ciężko Wam jest to sobie wyobrazić, to tym bardziej nalegam, żeby zajrzeć do szczegółów.

"IS" W JĘZYKU KOTLIN NASTĘPNĄ DROGĄ NA SKRÓTY

Ponownie muszę się zwrócić do biegłych języka Java pytając się jak im szło rzutowanie typu obiektu na inny typ. Zapewne rzutowali:

Cube cube = new Cube();			// klasa pochodna klasy "Shape"
Shape shape = (Shape)cube;		// rzutowanie typu instancji klasy pochodnej do typu klasy bazowej

i musieli też prawdopodobnie weryfikować w jakiś sposób czy można bezpiecznie wykonać określoną instrukcję na tym rzutowanym obiekcie. W tej chwili nie ma to znaczenia jak. Najistotniejszym punktem jest to, że Kotlin ponownie nas wyręcza oddając nam do dyspozycji składnię dzięki której raz kolejny mamy to samo, tylko bardziej zwięzłe i bezpieczniejsze.

Słowo kluczowe "is" w języku Kotlin służy do weryfikowania rzeczywistego typu obiektu (albo typu jego klasy bazowej, od której pochodzi) oraz potrafi "inteligentnie" rzutować za nas obiekt bez stosowania niczego innego poza instrukcją warunkową.

CZYM JEST RZUTOWANIE?

Zanim pociągnę dalej ten temat, parę słów teorii w ramach przypomnienia. Rzutowanie typu polega na skonwertowaniu typu zmiennej, tak aby był traktowany jak zupełnie inny typ danych celem wywołania jakichś metod, bądź "dopasowania" typu do określonej sytuacji. Rzutowanie widać nawet w typach prostych kiedy to skonwertowanie liczby zmiennoprzecinkowej na całkowitą, spowoduje "obcięcie" ułamka i zamianę na "Int". Używane w stosunku do obiektów, może przynieść różne skutki. Nie wszystkie operacje są dopuszczalne, bądź będą realizować zadanie bez zakłóceń.

PRZYKŁAD INTELIGENTNEGO RZUTOWANIA TYPU

Dam przykład. Załóżmy, że z pewnych powodów musimy dokonać rzutowania typu. W Kotlinie robi się to inaczej. Stosując wspomniane słowo "is" w języku Kotlin powoduje zweryfikowanie rzeczywistego typu obiektu jaki trzeba prześwietlić i ono samo transformuje typ na ten sprawdzany (o ile jest w stanie). Sztuczka zaczyna się od utworzenia sobie zmiennej, która będzie typu "klasa bazowa" naszego rzeczywistego typu:

val shape: Shape = Rectangle()

Głowicie się dlaczego? Gdyż przy konkretnym typie, sprawdzanie jego samego zawsze zwróci "prawdę". Tuż pod instrukcją, wstawiamy sobie "is" i mamy kilka możliwości. Na przykład poprzez instrukcję warunkową:

if(test is Shape) {
	test.draw()
}

Pamiętajcie o tym, że inteligentne rzutowanie działa w taki sposób, że wewnątrz każdego wariantu zmienna reprezentuje sprawdzany typ, tak jakby był zamieniany. To oznacza, że jeśli w typie klasy pochodnej występuje taka właściwość bądź metoda, którą sprawdzany typ nie dysponuje, nie będzie można z niej skorzystać, bo na tym polega BEZPIECZNE rzutowanie. Magia jaka za tym stoi nazywa się "smart cast", czyli tytułowe inteligentne rzutowanie typu obiektu jakie zawiera w sobie słowo "is" w języku Kotlin.

Warto jeszcze wspomnieć o takim dobrodziejstwie, że ta "inteligencja" pozwala naprawdę cholernie mocno zredukować ilości kodu na samo rzutowanie. Dysponując instrukcją wielokrotnego wyboru "when", możecie sprawdzać kilka typów tej samej zmiennej pod rząd, a Kotlin sam na bieżąco dostosuje typy do instrukcji wewnątrz! Coś naprawdę cudownego!

val x: Any = 60

when (x) {
	is Int -> println("Liczba całkowita: ${x.toInt()}")
	is String -> println("Długość łańcucha: ${x.length}")
}

Widzicie? Po przejściu przez słowo "is" w języku Kotlin, typ i operator strzałki, ta sama zmienna "transformuje się" w nowy typ, ale tylko w obrębie tych instrukcji, to jest "clue" tego wszystkiego! Dlatego dla przypadku typu "String", możliwe jest bezkarne korzystanie z właściwości i metod dla łańcuchów znaków. Dla własnego obiektu, będzie można korzystać z naszych właściwości i metod znajdujących się w tej klasie i tak dalej. A propos, użyty typ "Any" jest typem wszystkich pozostałych klas.

KIEDY INTELIGENTNE RZUTOWANIE NIE JEST MOŻLIWE?

Musicie uważać. Kotlin, choć posiada w sobie mnóstwo środków ułatwiających życie, to nie cudotwórca, że uchroni Was przed każdym złem kryjącym się w niewłaściwym programowaniu działania aplikacji. Próba inteligentnego rzutowania na inny typ spowoduje błąd kompilacji, jeśli kompilator dostrzeże możliwość wstawienia instrukcji modyfikującej typ pomiędzy sprawdzaniem, a wykonywaniem instrukcji przy użyciu obiektu poddanemu temu rzutowaniu! Wówczas trzeba kombinować ręcznie, przy pomocy podobnego słówka, "as".

Słowo kluczowe "is" w języku Kotlin

Słowo kluczowe "is" jest zdolne do automatycznego rzutowania typu obiektu na inny typ, ale tylko wówczas kiedy może zapewnić, że pomiędzy sprawdzaniem typu a wykonaniem instrukcji nie dojdzie do podmienienia typu.


Nie chciałbym się powtarzać, aczkolwiek słowo kluczowe "is" w języku Kotlin stanowi kolejną broń w arsenale języka mającą na celu ochronić programistę przed potencjalnymi błędami aplikacji wynikającymi z niedopatrzeń, bądź sprzecznych instrukcji.

PODOBNE ARTYKUŁY