Interoperabilità Java di Kotlin

1. Panoramica

In questo tutorial, discuteremo l' interoperabilità tra Java e Kotlin. Copriremo alcuni esempi di base e altri scenari più complessi.

2. Configurazione di Kotlin

Creare un progetto Kotlin è molto semplice usando IntelliJ, Eclipse e persino la riga di comando, tuttavia per questo tutorial seguiremo i passaggi di installazione del nostro tutorial precedente Introduzione a Kotlin poiché ha già ciò di cui abbiamo bisogno per i nostri scopi demo.

3. Le basi

Chiamare Java da Kotlin è semplice e fluido poiché è stato creato con l'idea dell'interoperabilità .

Creiamo questa classe Customer utilizzando Java core:

public class Customer { private String firstName; private String lastName; private int age; // standard setters and getters }

4. Getters e setters

Ora lavoriamo con questo semplice POJO Java di Kotlin.

Getter e setter che seguono la convenzione Java per questi tipi di metodi sono rappresentati come attributi in Kotlin:

val customer = Customer() customer.firstName = "Frodo" customer.lastName = "Baggins" assertEquals(customer.firstName, "Frodo") assertEquals(customer.lastName, "Baggins")

Vale la pena notare che la nuova parola chiave non è necessaria per creare un'istanza di un oggetto.

Il linguaggio cerca di evitare il più possibile il codice boilerplate, quindi non chiamiamo getter / setter esplicitamente - possiamo semplicemente usarli usando la notazione del campo.

Dobbiamo ricordare che se una classe Java ha solo metodi setter, la proprietà non sarà accessibile poiché il linguaggio non supporta le proprietà solo set.

Se un metodo restituisce void, quando viene chiamato da Kotlin restituirà Unit .

5. Null Safety

Kotlin è ben noto per la sua funzionalità di sicurezza nulla, ma come sappiamo, questo non è il caso di Java, il che lo rende poco pratico per gli oggetti provenienti da esso. Un esempio molto semplice può essere visto se abbiamo un array String :

val characterList = ArrayList() characterList.add("Bilbo") val character = list[0]

Kotlin non visualizza alcun errore di nullability in fase di compilazione quando un metodo viene chiamato su una variabile di un tipo di piattaforma e questo tipo non può essere scritto esplicitamente nel linguaggio. Quindi, quando viene assegnato un valore, possiamo fare affidamento su questa inferenza, oppure possiamo semplicemente scegliere il tipo che ci aspettiamo:

val a: String? = character val a: String = character

Sono entrambi consentiti, ma nel caso del tipo non nullo, il compilatore lo asserirà immediatamente al momento dell'assegnazione, il che impedirà alla variabile di mantenere un valore nullo.

Alla fine, il compilatore fa del suo meglio per evitare i null, ma è comunque impossibile eliminarlo a causa dei generici.

6. Array

In Kotlin gli array sono invarianti, il che significa che non ci consentirebbe di assegnare Array a Array per evitare errori di runtime.

Quindi abbiamo una classe di esempio:

public class ArrayExample { public int sumValues(int[] nums) { int res = 0; for (int x:nums) { res += x; } return res; } }

Se vogliamo passare un array di primitive a questo metodo, dobbiamo usare una delle classi specializzate di Kotlin:

val ex = ArrayExample() val numArray = intArrayOf(1, 2, 3) assertEquals(ex.sumValues(numArray), 6)

7. Varargs

Java ci dà la possibilità di passare un numero qualsiasi di argomenti a un metodo:

public int sumArgValues(int... sums) { // same as above }

Il processo è lo stesso, con la leggera differenza che dobbiamo usare l'operatore spread * per passare l'array:

assertEquals(ex.sumValues(*numArray), 6)

Al momento non è possibile passare null a un metodo varargs.

8. Eccezioni

In Kotlin tutte le eccezioni sono deselezionate , il che significa che il compilatore non ci costringerà a rilevare alcuna eccezione:

// In our Java code public void writeList() throws IOException { File file = new File("E://file.txt"); FileReader fr = new FileReader(file); fr.close(); } // In Kotlin fun makeReadFile() { val ax = ArrayExample() ax.writeList() }

9. Riflessione

In poche parole, la riflessione funziona su entrambe le classi Kotlin e Java:

val instance = Customer::class.java val constructors = instance.constructors assertEquals(constructors.size, 1) assertEquals(constructors[0].name, "com.baeldung.java.Customer")

Possiamo anche ottenere metodi getter e setter, una KProperty per un campo Java e una KFunction per un costruttore.

10. Metodi oggetto

Quando gli oggetti vengono importati in Kotlin, tutti i riferimenti del tipo java.lang.Object vengono modificati in kotlin.Any :

val instance = Customer::class val supertypes = instance.supertypes assertEquals(supertypes[0].toString(), "kotlin.Any")

11. Conclusione

Questo breve tutorial ci fornisce una maggiore comprensione dell'interoperabilità Java di Kotlin . Abbiamo dato un'occhiata ad alcuni semplici esempi per mostrare come Kotlin generalmente porti a un codice meno dettagliato nel complesso.

Come sempre, l'implementazione di tutti questi esempi e snippet può essere trovata su GitHub.