kotlinworkshop: classes, inheritance and...
TRANSCRIPT
![Page 1: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/1.jpg)
Kotlin Workshop:
Classes, Inheritance and more�
Andrey Breslav
Dmitry Jemerov
![Page 2: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/2.jpg)
Outline
• Classes– Having multiple supertypes (Mixins)
– First-class delegation
• Generics– Variance annotations
– Type projections
• Class objects– No static members in classes
– Generic bounds
• (Pattern matching)
![Page 3: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/3.jpg)
Top and Bottom
• class Any {}
– Has no members
– Every other class inherits from Any
– Every type is a subtype of Any?
• special type Nothing
– Has no values
– Every type is a supertype of Nothing
– Nothing? is the most precise type of null
![Page 4: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/4.jpg)
Intrinsics
• Built-in types– Any, Nothing
• Intrinsic types– Unit, String, Array<T>
– Int, Int?, Double, Double?, …
– Functions, Tuples
• Intrinsic operations
– Arithmetic
– Array access, length, iteration
– String operations
– . (anything you like)
![Page 5: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/5.jpg)
Correspondence to Java
Array<Int>?int[]Array<Int>
--Nothing
Foo?FooFoo
Array<Foo>
String
Int?
Int
Unit
Any
Kotlin
Array<Foo?>?Foo[]
String?String
Int?Integer
Intint
Unitvoid
Any?Object
KotlinJavaGEN LOAD
![Page 6: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/6.jpg)
Classes and Inheritance
class Example(b : B) : Base(b) { … }
• Any is the default supertype
• The (primary) constructor initializes supertypes
• Classes are final by default
• Members are non-virtual by default
• Overrides are marked explicitly
• There can be many supertypes
![Page 7: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/7.jpg)
Diamonds before us
open class A() {
abstract fun foo()
virtual val bar : Int
}
open class B() : A() {
fun foo() { … }
}
open class C() : A() {
}
class D() : B(), C() {
override val bar : Int
get() = this<B>.bar
}
![Page 8: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/8.jpg)
Mixin implementation (I)open class A() {
fun foo() = bar + 1
virtual val bar : Int
}
class AImpl implements A {
private final int bar;
public int foo() {
return this.bar() + 1;
}
public int bar() {
return this.bar;
}
interface A {
int foo();
int bar();
}
class ADImpl implements A {
private final A $this;
private final int bar;
public int foo() {
return $this.bar() + 1;
}
public int bar() {
return this.bar;
}
![Page 9: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/9.jpg)
Mixin implementation (II)open class A() {
fun foo() = bar + 1
virtual val bar : Int
}
class B extends XImpl implements A {
private final ADImpl $a;
public B() {
this.$a = new ADImpl(this);
}
public int foo() {
return $a.foo();
}
public int bar() { return 2; }
class B() : X(), A() {
override val bar : Int
get() = 2
}
![Page 10: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/10.jpg)
Generic classes and types
class Producer<out T> {
fun produce() : T
}
class Consumer<in T> {
fun consume(t : T)
}
class Ouoroboros<T> {
fun consume(t : T)
fun produce() : T
}
Producer<Int> <: Producer<Any>
Consumer<Any> <:
Consumer<Int>
Ouoroboros<Int> <:>
Ouoroboros<Any>
Ouoroboros<out Int> <: Ouoroboros<out Any>
Ouoroboros<in Any> <: Ouoroboros<in Int>
![Page 11: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/11.jpg)
Reified generics
• Objects of C<T>
– extra field of type TypeInfo<C<T>>
• Internal Java interface KotlinObject
– TypeInfo<?> getTypeInfo()
• Generic functions – extra arguments of type TypeInfo<T>
• is and as perform a “deep” subtype check
– as performs a CHECKCAST and then a further check
– is performs an instanceof and then a further check
• TypeInfo objects are reused as much as possible
![Page 12: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/12.jpg)
Type erasure and Kotlin
• Java’s generic classes remain type-erased in Kotlin
– as performs a CHECKCAST
– is performs an instanceof
– compiler prohibits deep checks like• x is java.util.List<Int>
• Java’s List becomes List<*>
– Foo<*> is a shorthand for Foo<out B>• class Foo<T : B>
![Page 13: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/13.jpg)
Class objects
• Kotlin has no static class members
• What is there then?
– Namespace-level functions/properties
– Object declarations (singletons)
– Class objects• Any class can have one
• Each class can have only one
• Class objects can access internals of their classes
![Page 14: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/14.jpg)
Class object example (I)
class Example() {
class object {
fun create() = Example()
}
}
fun demo() {
val e = Example.create()
}
![Page 15: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/15.jpg)
Class object example (II)class Example() {
class object : Factory<Example> {override fun create() = Example()
}}
fun demo() {val factory : Factory<Example> = Exampleval e = factory.create()
}
abstract class Factory<T> {fun create() : T
}
![Page 16: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/16.jpg)
Class object example (III)class Lazy<T>()
where class object T : Factory<T> {
private var store : T? = nullpublic val value : Tget() {
if (store == null) {store = T.create()
}return store
}}
fun demo() {val l = Lazy<Example>()val v = l.value
}
![Page 17: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/17.jpg)
And now for something
completely different�
Pattern matching
![Page 18: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/18.jpg)
When expressions
when (x) {
1, 2, 3 => .
in 4..10 => .
!in 0..10000 => .
is Tree => .
is Tree @ (val l, *) => .
is Tree @ (null, Tree @ (*, *)) => .
is Tree @ (val l is Tree @ (*, *), *) => .
is TreeValue @ (val v in 1..100, *, *) => .
}
fun Any?.TreeValue() : (Int, Tree?, Tree?)? {
if (this !is Tree) return null
return (value, right, left)
}
![Page 19: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/19.jpg)
And now for something
completely different�
Breaks in custom loops
(a design I would like to discuss)
![Page 20: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/20.jpg)
Labels, Break and Continue
@outer for (x in list1) {for (y in list2) {if (.) {// Breaks the inner loopbreak
}if (.) {// Breaks the outer loopbreak@outer
}}
}
![Page 21: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/21.jpg)
Breaks in foreach()
@outer list1.foreach { x =>list2.foreach { y =>if (.) {// Breaks the inner loopbreak
}if (.) {// Breaks the outer loopbreak@outer
}}
}
![Page 22: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/22.jpg)
Breakable foreach()
inline fun <T> Iterable<T>.foreach(
body : breakable fun(T) : Unit
) {
@@ for (item in this) {
// A break from body() breaks the loop
body(item)
}
}
![Page 23: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/23.jpg)
Resources
• http://jetbrains.com/kotlin
• http://blog.jetbrains.com/kotlin
• @project_kotlin
• @intelliyole
• @abreslav
![Page 24: KotlinWorkshop: Classes, Inheritance and morewiki.jvmlangsummit.com/images/9/93/Jetbrains-Kotlin-workshop.pdf · GEN Java LOAD Kotlin. Classes and Inheritance class Example(b : B)](https://reader030.vdocument.in/reader030/viewer/2022041101/5edae3cb09ac2c67fa687992/html5/thumbnails/24.jpg)
Kotlin Workshop:
Classes, Inheritance and more�
Andrey Breslav
Dmitry Jemerov