42
Mixed projects: Java + Kotlin Svetlana Isakova

Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Embed Size (px)

Citation preview

Page 1: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Mixed projects: Java + Kotlin

Svetlana Isakova

Page 2: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Compilation of a mixed project

*.java

kotlinc

*.kt

*.class

javac *.class

*.jar

Page 3: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Nullability

Page 4: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Nullability

?Type =

Java Kotlin

Page 5: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Nullability annotations

@Nullable

@NotNull Type

Type?

Type

+

+

=

=

Type

Java Kotlin

Page 6: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Java type without annotation has “unknown” nullability

public class Session { String getDescription() { return null; }}

Page 7: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Explicit type

val session = Session() val description: String? = session.descriptionprintln(description!!.length)

val description1: String = session.description println(description1.length)

KNPE

IllegalStateException: session.description must not be null

Page 8: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Not-null typesclass A { fun x(s: List<String>) { println(s) }

private fun y(s: String) { println(s) } }

public final class A { public final void x(@NotNull List<String> s) { Intrinsics.checkParameterIsNotNull(s, "s"); System.out.println(s); } private final void y(String s) { System.out.println(s); }}

is compiled to

Page 9: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Platform type

Type Type= Type?OR

Java Kotlin

notation in error messages: Type!

Page 10: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Inferred type

val session = Session()val description = session.descriptionprintln(description.length)

val i: Int = session.description

NPE

Error: Type mismatch: inferred type is String! but Int was expected

println(description?.length)

Page 11: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Prefer explicit Kotlin types when working with Java

Page 12: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Basic types

Page 13: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Primitive & wrapper types

Java Kotlin

int Int

double Double

boolean Boolean

Java Kotlin

java.lang.Integer Int?

java.lang.Double Double?

java.lang.Boolean Boolean?

Page 14: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Generic arguments

Kotlin Java

List<Int> List<Integer>

Page 15: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Arrays of primitive types

Kotlin Java

Array<Int> Integer[]

IntArray int[]

Page 16: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Any?

Kotlin Java

Any? java.lang.Object

Page 17: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Unitfun f(): Unit { /*...*/ }

fun f() { /*...*/ }

Page 18: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Unit as generic argument

interface Processor<T> { fun process(): T } class NoResultProcessor : Processor<Unit> { override fun process() { // do stuff } }

Page 19: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Unit

Kotlin Java

Unit void

Foo<Unit> Foo<Unit>

Page 20: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Nothing

fun fail(message: String): Nothing { throw IllegalStateException(message)}

val n = null

: Nothing?

Page 21: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Nothing

Kotlin Java

Nothing void

List<Nothing> List //raw type

Page 22: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Any & Nothing typesAny

Int

StringList<T>

Parent

Nothing

MutableList<T>

Child

Page 23: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Type hierarchy

Any

Int

StringList<T>

Parent

Nothing

MutableList<T>

Child

Any?

Int?

String?List<T>?

Parent?

Nothing?

MutableList<T>?

Child?

Page 24: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Collections

Page 25: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

List & MutableList

kotlin.List

kotlin.MutableList

• Two interfaces declared in kotlin package

•MutableList extends List

Page 26: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Read-only != immutable

(1, 2, 3)• Read-only interface just lacks mutating methods

• The actual list can be changed by another reference

listmutableList

Page 27: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Under the hood

fun getNames(): List<String>fun getNames(): MutableList<String>

java.util.List<String> getNames();

Both functions are compiled to:

Page 28: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

At runtime is a good old java.util.List

List in Kotlin

Page 29: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Iterable

Collection

MutableIterable

List

MutableCollection

Set

MutableList

MutableSet

ArrayList

HashSet

Page 30: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Platform type

Type Type= Type?OR

Java Kotlin

List List= MutableListOR

Page 31: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Collection as platform type

(Mutable)List<Int!>

Page 32: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Annotations

Page 33: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

@JvmName// Data.kt fun foo() {}

public final class DataKt { public static void foo() { } }

@file:JvmName("FooUtils") fun foo() {}

public final class FooUtils { public static final void foo() { } }

Page 34: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

@JvmName

fun List<String>.filterValid(): List<String>fun List<Int>.filterValid(): List<Int>

Error: platform declaration clash: declarations have the same JVM signature (filterValid(Ljava/util/List;)Ljava/util/List;)

Page 35: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

@JvmName

fun List<String>.filterValid(): List<String>

@JvmName("filterValidInt") fun List<Int>.filterValid(): List<Int>

Page 36: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

@JvmOverloads

@JvmOverloadsfun f(a: String, b: Int = 0, c: String = "abc") { // ...}

// Javavoid f(String a, int b, String c) { }void f(String a, int b) { }void f(String a) { }

Page 37: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

@Throws

@Throws(IOException::class) fun foo() { throw IOException()}

Page 38: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Checked exceptions

// Javatry { DemoKt.foo();} catch (IOException e) { // ...}

fun foo() { throw IOException() }

Error: Exception java.io.IOException is never thrown in body

of corresponding try statement

Page 39: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Checked exceptions

// Javatry { DemoKt.foo();} catch (IOException e) { // ...}

@Throws(IOException::class) fun foo() { throw IOException() }

Page 40: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

@JvmStaticclass C { companion object { @JvmStatic fun foo() {} fun bar() {} }}

// JavaC.foo();C.Companion.bar();

Page 41: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

@JvmStaticobject Obj { @JvmStatic fun foo() {} fun bar() {}}

// Java Obj.foo();Obj.bar();Obj.INSTANCE.bar();Obj.INSTANCE.foo();

Page 42: Программирование на Kotlin, осень 2016: Mixing Java and Kotlin

Have a nice Kotlin!