Slide 1

Slide 1 text

Mapped&TypeͱPla+orm&Typeͷ࿩ @RyotaMurohoshi 2016/12/13(Ր))ୈ4ճKotlinษڧձ)ˏ)Sansan

Slide 2

Slide 2 text

ࣗݾ঺հ • ࣨ੕྄ଠ(ΉΖ΄͠) • @RyotaMurohoshi • ࢓ࣄͰKotlin+Android

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

·ͣ؆୯ʹPla$orm(Typeͷ࿩Λͯ͠ ͦͷޙMapped&Typeͷ࿩Λ͠·͢ ʰ(Mutable)List!ʱܕͱ͔ͷ࿩΋

Slide 6

Slide 6 text

ͬͦ͘͞࿩͸ԣಓʹͦΕ·͕͢ String?΍String!ɺͳΜͯಡΈ·͢ʁ

Slide 7

Slide 7 text

͞Βͬͱཧղ͢ΔPla$orm(Type

Slide 8

Slide 8 text

ʰKotlinͩͬͨΒɺઈରNullPointerExep/onى͖ͳ͍ʱ ͜Ε͸ؒҧ͍ʂ

Slide 9

Slide 9 text

Kotlinͱnull // ίϯύΠϧΤϥʔ val string : String = null // ͜Ε͸OK val string : String? = null

Slide 10

Slide 10 text

String?Λฦؔ͢਺͕͋ͬͯ fun loadMessage(): String? = /*ུ*/

Slide 11

Slide 11 text

// OK val message : String? = loadMessage() // ίϯύΠϧΤϥʔ val message : String = loadMessage() // Nullableܕ͸?.Ͱͳ͍ͱϝϯόΞΫηεͰ͖ͳ͍ // ΋͠message͕nullͳΒmessage?.length΋null println(message?.length) // ίϯύΠϧΤϥʔ println(message.length)

Slide 12

Slide 12 text

Kotlin͚ͩͳΒ ͦ͏ͦ͏NullPointerExcep/onى͖ͳ͍ ࣮͸Kotlin͚ͩͰ΋NullPointerExcep0onग़ͤΔΒ͍͠

Slide 13

Slide 13 text

Java͔ΒདྷͨΦϒδΣΫτ͸ʁ

Slide 14

Slide 14 text

Java͔ΒདྷͨΦϒδΣΫτͷ࢖͍ํΛؒҧ͑Δͱ NullPointerExcep/onͱ͔IllegalStateExcep/onʹͳΔ

Slide 15

Slide 15 text

Pla$orm(Type

Slide 16

Slide 16 text

ݪଇJava͔ΒདྷͨΦϒδΣΫτ͸Pla&orm*Type

Slide 17

Slide 17 text

Javaͷίʔυ public class Utility { public static String loadMessage() { /* ུ */ } }

Slide 18

Slide 18 text

Kotlinͷίʔυ // IDEͩͱʮString!ʯͬͯදࣔ͞ΕΔ Platform Type val message = Utility.loadMessage() // String?ܕʹɻString!͸String?ʹ΋୅ೖՄ val message : String? = Utility.loadMessage() // StringܕʹɻString!͸Stringʹ΋୅ೖՄ val message : String = Utility.loadMessage()

Slide 19

Slide 19 text

஫ҙ఺

Slide 20

Slide 20 text

IllegalStateExcep,onʹͳΔྫ

Slide 21

Slide 21 text

IllegalStateExcep,onʹͳΔྫ // Platform TypeͷString!ܕΛStringܕʹ୅ೖͨ࣌͠ɺ // ͦͷΦϒδΣΫτ͕nullͳΒIllegalStateException val message: String = Utility.loadMessage()

Slide 22

Slide 22 text

NullPointerExcep/onʹͳΔྫ

Slide 23

Slide 23 text

NullPointerExcep/onʹͳΔྫ // String!ܕ val message = Utility.loadMessage() // Platform TypeͷString!ܕͷϝϯόʹΞΫηεͨ࣌͠ɺ // ͦͷΦϒδΣΫτ͕nullͩͬͨΒNullPointerException println(message.length) // ͜ΕͳΒOKɻnullʹͳΔ println(message?.length)

Slide 24

Slide 24 text

ίϯύΠϧΤϥʔʹ͸ͳΒͳͯ͘΋ ࣮ߦ࣌ʹΤϥʔʹͳΔ͔Β஫ҙʂ

Slide 25

Slide 25 text

@Nullable΍@NotNullΛ͏·͘࢖͓͏ʂ @NullableΛ͚ͭͨJavaͷString͸String? @NotNullΛ͚ͭͨJavaͷString͸String

Slide 26

Slide 26 text

ۦ͚଍ͰPla$orm(Type ৄ͘͠͸ɺQiitaͷΞυϕϯτΧϨϯμʔݟͯͶ

Slide 27

Slide 27 text

ͱ͜ΖͰPla$orm(Type͸Ϋϥεܕͷ࿩ ͡Ό͋intͱ͔doubleͱ͔booleanͱ͔ɺ primi%ve͸Ͳ͏ͳΔʁ

Slide 28

Slide 28 text

Mapped&Type

Slide 29

Slide 29 text

JavaͷintɾdoubleɾboolenͳͲ͸ KotlinͰ͸ɺkotlin.Intɺkotlin.Doubleɺkotlin.BooleanʹͳΓ·͢

Slide 30

Slide 30 text

ݴ͍׵͑ΔͱJavaͷprimi(ve͸ɺ KotlinͰ͸ݻ༗ͷTypeͱͯ͠ѻΘΕΔ

Slide 31

Slide 31 text

Mapped&Type

Slide 32

Slide 32 text

(͜Ε͸υΩϡϝϯτʹॻ͍ͯ͋ͬͨ)

Slide 33

Slide 33 text

͡Ό͋JavaͷIntegerͱ͔Doubleͱ͔Boolenͱ͔͸ɺ primi%veܕͷϥούʔܕ͸Kotlin͔ΒͲ͏ݟ͑Δʁ (ͳ͔ͥυΩϡϝϯτʹͳ͔ͬͨ)

Slide 34

Slide 34 text

JavaͷInteger͸ KotlinͰ͸Int!

Slide 35

Slide 35 text

Javaͷίʔυ public class JInts { public static Integer getWrapperInteger() { return /*ུ*/; } }

Slide 36

Slide 36 text

Kotlinͷίʔυ // num͸Platform TypeͷInt!ܕ val num = JInts.getWrapperInteger() ѻ͍ํΛؒҧ͑ͨΒIllegalStateExcep,onʹͳͬͨΓɺNullPointerExcep,onʹͳͬͨΓ

Slide 37

Slide 37 text

ଞͷPla$orm(Typeͱಉ༷ʹ @Nullable΍@NotNullΛ࢖͓͏

Slide 38

Slide 38 text

Javaͷίʔυ public class JInts { public static Integer getWrapperInteger() { return /*ུ*/; } @Nullable public static Integer getWrapperIntegerNullable() { return /*ུ*/; } @NotNull public static Integer getWrapperIntegerNotNull() { return /*ུ*/; } }

Slide 39

Slide 39 text

Kotlinͷίʔυ // num͸Platform TypeͷInt!ܕ val num = JInts.getWrapperInteger() // num͸Int?ܕ val num = JInts.getWrapperIntegerNullable() // num͸Intܕ val num = JInts.getWrapperIntegerNotNull()

Slide 40

Slide 40 text

ͳΔ΄Ͳ

Slide 41

Slide 41 text

Ͱ͸ٯʹɺKotlinͷInt?΍Double?͸Java͔ΒͲ͏ݟ͑Δʁ

Slide 42

Slide 42 text

KotlinͷInt? JavaͰ͸Interger

Slide 43

Slide 43 text

Kotlinͷίʔυ class KInts { companion object { @JvmStatic fun getInt(): Int = 0 @JvmStatic fun getNullableInt(): Int? = 0 } }

Slide 44

Slide 44 text

Javaͷίʔυ public class KIntsUsage { public static void main(String[] args) { int num0 = KInts.getInt(); Integer num1 = KInts.getNullableInt(); // ΞϯϘΫγϯάͰ͜͏΋͔͚Δ int num2 = KInts.getNullableInt(); } }

Slide 45

Slide 45 text

KotlinͷInt? JavaͰ͸Interger

Slide 46

Slide 46 text

ͳΔ΄Ͳ

Slide 47

Slide 47 text

Mapped&Type͸࣮͸primi,ve͚ͩ͡Όͳͯ͘ࢀরܕʹ΋͋Δ • java.lang.Enum,<.>,kotlin.Enum! • java.lang.Void,<.>,kotlin.Nothing! • java.lang.String,<.>,kotlin.String! • java.lang.Number,<.>,kotlin.Number! ࣮͸String΋ʂʂʂ

Slide 48

Slide 48 text

࠷ޙʹ

Slide 49

Slide 49 text

ʰ(Mutable)List!ʱͱ͸ʁ

Slide 50

Slide 50 text

Mapped&TypeͱPla+orm&Typeͷ߹Θٕͤ

Slide 51

Slide 51 text

Kotlinͷ 2ͭͷϦετΠϯλʔϑΣʔε

Slide 52

Slide 52 text

kotlin.collec*ons.List count()ͱ͔ཁૉऔಘͱ͔ReadOnlyͳϝιου͔͠ͳ͍ (ͪͳΈʹList͸ΠϛϡʔλϒϧͰ͸ͳ͍)

Slide 53

Slide 53 text

kotlin.collec*ons.MutableList ListΛܧঝ͠͞ΒʹཁૉΛมߋ͢ΔϝιουΛ࣋ͭ (clearͱ͔addͱ͔Ͱ͖Δ)

Slide 54

Slide 54 text

ͲͪΒ΋JavaͰ͸ java.u&l.List

Slide 55

Slide 55 text

Kotlinͷίʔυ class KLists { companion object { @JvmStatic fun getStringList(): List = listOf("") @JvmStatic fun getMutableStringList(): MutableList = mutableListOf("") } }

Slide 56

Slide 56 text

Javaͷίʔυ List list0 = KLists.getStringList(); List list1 = KLists.getMutableStringList();

Slide 57

Slide 57 text

Ͱ͸Javaͷjava.u'l.List Kotlin͔Β͸Ͳ͏ݟ͑Δ?

Slide 58

Slide 58 text

Javaͷίʔυ public class JLists { public static List getList() { return new ArrayList<>(); } }

Slide 59

Slide 59 text

Kotlinͷίʔυ // IDEͰͷදࣔ͸ʰ(Mutable)List!ʱܕ val list = JLists.getList() println(list.count) // MutableListͷϝιου͕asͳ͠Ͱݺ΂Δ list.clear() println(list.count)

Slide 60

Slide 60 text

MutableList͡Όͳͯ͘Listͱͯ͠ѻ͍͍ͨ৔߹͸ʁ

Slide 61

Slide 61 text

@ReadOnly

Slide 62

Slide 62 text

@ReadOnlyͱ@MutableΛ෇༩ͨ͠Javaͷίʔυ(@NotNull΋) public class JLists { @NotNull @ReadOnly public static List getReadonlyList() { return new ArrayList<>(); } @NotNull @Mutable public static List getMutableList() { return new ArrayList<>(); } }

Slide 63

Slide 63 text

Kotlinͷίʔυ // kotlin.collections.List val list = JLists.getReadonlyList() // ͜Ε΋OK val list : List = JLists.getReadonlyList() // ίϯύΠϧΤϥʔ val list : MutableList = JLists.getReadonlyList() println(list.count()) // OK list.clear() // ίϯύΠϧΤϥʔ @ReadOnlyͱ@MutableΛ͚ͭΔ͜ͱͰมԽ

Slide 64

Slide 64 text

// kotlin.collections.MutableList val list = JLists.getMutableList() // ͜Ε΋OK val list : MutableList = JLists.getMutableList() println(list.count()) // OK list.clear() // OK // MutableList͸ListΛܧঝ͍ͯ͠ΔͷͰɺͭ͡͸͜Ε΋OK // ͨͩclearͱ͔add͸ݺ΂ͳ͍ // val list : List = JLists.getMutableList() @ReadOnlyͱ@MutableΛ͚ͭΔ͜ͱͰมԽ

Slide 65

Slide 65 text

͜ΕΒ͸List͚ͩͰͳ͘ Set΍MapͰ΋͍ͬ͠ΐ

Slide 66

Slide 66 text

·ͱΊ Pla$orm(TyoeͱMapped(Type ཧղ͓ͯ͜͠͏ʂ