Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Mapped TypeとPlatform Typeの話
Search
RyotaMurohoshi
December 13, 2016
Technology
0
9.1k
Mapped TypeとPlatform Typeの話
2016/12/13(火)のSansanさんで開催された第4回 Kotlin Sansan勉強会での発表資料です。
RyotaMurohoshi
December 13, 2016
Tweet
Share
More Decks by RyotaMurohoshi
See All by RyotaMurohoshi
Unityの合同同人誌や合同商業誌を書いてる僕は感想やレビューや評価が欲しい
ryotamurohoshi
0
530
Unity 2021.1での Unityパッケージの名称変更について
ryotamurohoshi
0
710
Odin Validationはいいぞ!
ryotamurohoshi
2
960
Tilemapはいいぞ!2020 〜すごいぞ、プロジェクト専用拡張Brush〜
ryotamurohoshi
0
2.4k
Unityでも、新しいC#
ryotamurohoshi
0
1.3k
Riderはいいぞ!
ryotamurohoshi
1
3.5k
Riderのススメ〜俺はRiderここが好き〜
ryotamurohoshi
1
2.4k
Unity開発者に伝えたい.NETのこと
ryotamurohoshi
4
37k
ImportedLinqのススメ
ryotamurohoshi
0
1.4k
Other Decks in Technology
See All in Technology
標準技術と独自システムで作る「つらくない」SaaS アカウント管理 / Effortless SaaS Account Management with Standard Technologies & Custom Systems
yuyatakeyama
3
1.2k
AIエージェント最前線! Amazon Bedrock、Amazon Q、そしてMCPを使いこなそう
minorun365
PRO
13
4.6k
GitHub Copilot の概要
tomokusaba
1
130
生成AIで小説を書くためにプロンプトの制約や原則について学ぶ / prompt-engineering-for-ai-fiction
nwiizo
2
440
Snowflake Summit 2025全体振り返り / Snowflake Summit 2025 Overall Review
mtpooh
2
380
25分で解説する「最小権限の原則」を実現するための AWS「ポリシー」大全 / 20250625-aws-summit-aws-policy
opelab
9
980
OpenHands🤲にContributeしてみた
kotauchisunsun
1
380
解析の定理証明実践@Lean 4
dec9ue
0
160
Liquid Glass革新とSwiftUI/UIKit進化
fumiyasac0921
0
160
AIのAIによるAIのための出力評価と改善
chocoyama
2
530
Model Mondays S2E02: Model Context Protocol
nitya
0
200
ObsidianをMCP連携させてみる
ttnyt8701
2
140
Featured
See All Featured
Thoughts on Productivity
jonyablonski
69
4.7k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
228
22k
GraphQLとの向き合い方2022年版
quramy
47
14k
Balancing Empowerment & Direction
lara
1
350
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
930
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Build The Right Thing And Hit Your Dates
maggiecrowley
36
2.8k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Transcript
Mapped&TypeͱPla+orm&Typeͷ @RyotaMurohoshi 2016/12/13(Ր))ୈ4ճKotlinษڧձ)ˏ)Sansan
ࣗݾհ • ྄ࣨଠ(ΉΖ΄͠) • @RyotaMurohoshi • ࣄͰKotlin+Android
None
None
·ͣ؆୯ʹPla$orm(TypeͷΛͯ͠ ͦͷޙMapped&TypeͷΛ͠·͢ ʰ(Mutable)List<String!>!ʱܕͱ͔ͷ
ͬͦ͘͞ԣಓʹͦΕ·͕͢ String?String!ɺͳΜͯಡΈ·͢ʁ
͞Βͬͱཧղ͢ΔPla$orm(Type
ʰKotlinͩͬͨΒɺઈରNullPointerExep/onى͖ͳ͍ʱ ͜Εؒҧ͍ʂ
Kotlinͱnull // ίϯύΠϧΤϥʔ val string : String = null //
͜ΕOK val string : String? = null
String?Λฦ͕ؔ͋ͬͯ͢ fun loadMessage(): String? = /*ུ*/
// OK val message : String? = loadMessage() // ίϯύΠϧΤϥʔ
val message : String = loadMessage() // Nullableܕ?.Ͱͳ͍ͱϝϯόΞΫηεͰ͖ͳ͍ // ͠message͕nullͳΒmessage?.lengthnull println(message?.length) // ίϯύΠϧΤϥʔ println(message.length)
Kotlin͚ͩͳΒ ͦ͏ͦ͏NullPointerExcep/onى͖ͳ͍ ࣮Kotlin͚ͩͰNullPointerExcep0onग़ͤΔΒ͍͠
Java͔ΒདྷͨΦϒδΣΫτʁ
Java͔ΒདྷͨΦϒδΣΫτͷ͍ํΛؒҧ͑Δͱ NullPointerExcep/onͱ͔IllegalStateExcep/onʹͳΔ
Pla$orm(Type
ݪଇJava͔ΒདྷͨΦϒδΣΫτPla&orm*Type
Javaͷίʔυ public class Utility { public static String loadMessage() {
/* ུ */ } }
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()
ҙ
IllegalStateExcep,onʹͳΔྫ
IllegalStateExcep,onʹͳΔྫ // Platform TypeͷString!ܕΛStringܕʹೖͨ࣌͠ɺ // ͦͷΦϒδΣΫτ͕nullͳΒIllegalStateException val message: String =
Utility.loadMessage()
NullPointerExcep/onʹͳΔྫ
NullPointerExcep/onʹͳΔྫ // String!ܕ val message = Utility.loadMessage() // Platform TypeͷString!ܕͷϝϯόʹΞΫηεͨ࣌͠ɺ
// ͦͷΦϒδΣΫτ͕nullͩͬͨΒNullPointerException println(message.length) // ͜ΕͳΒOKɻnullʹͳΔ println(message?.length)
ίϯύΠϧΤϥʔʹͳΒͳͯ͘ ࣮ߦ࣌ʹΤϥʔʹͳΔ͔Βҙʂ
@Nullable@NotNullΛ͏·͓͘͏ʂ @NullableΛ͚ͭͨJavaͷStringString? @NotNullΛ͚ͭͨJavaͷStringString
ۦ͚ͰPla$orm(Type ৄ͘͠ɺQiitaͷΞυϕϯτΧϨϯμʔݟͯͶ
ͱ͜ΖͰPla$orm(TypeΫϥεܕͷ ͡Ό͋intͱ͔doubleͱ͔booleanͱ͔ɺ primi%veͲ͏ͳΔʁ
Mapped&Type
JavaͷintɾdoubleɾboolenͳͲ KotlinͰɺkotlin.Intɺkotlin.Doubleɺkotlin.BooleanʹͳΓ·͢
ݴ͍͑ΔͱJavaͷprimi(veɺ KotlinͰݻ༗ͷTypeͱͯ͠ѻΘΕΔ
Mapped&Type
(͜ΕυΩϡϝϯτʹॻ͍ͯ͋ͬͨ)
͡Ό͋JavaͷIntegerͱ͔Doubleͱ͔Boolenͱ͔ɺ primi%veܕͷϥούʔܕKotlin͔ΒͲ͏ݟ͑Δʁ (ͳ͔ͥυΩϡϝϯτʹͳ͔ͬͨ)
JavaͷInteger KotlinͰInt!
Javaͷίʔυ public class JInts { public static Integer getWrapperInteger() {
return /*ུ*/; } }
Kotlinͷίʔυ // numPlatform TypeͷInt!ܕ val num = JInts.getWrapperInteger() ѻ͍ํΛؒҧ͑ͨΒIllegalStateExcep,onʹͳͬͨΓɺNullPointerExcep,onʹͳͬͨΓ
ଞͷPla$orm(Typeͱಉ༷ʹ @Nullable@NotNullΛ͓͏
Javaͷίʔυ public class JInts { public static Integer getWrapperInteger() {
return /*ུ*/; } @Nullable public static Integer getWrapperIntegerNullable() { return /*ུ*/; } @NotNull public static Integer getWrapperIntegerNotNull() { return /*ུ*/; } }
Kotlinͷίʔυ // numPlatform TypeͷInt!ܕ val num = JInts.getWrapperInteger() // numInt?ܕ
val num = JInts.getWrapperIntegerNullable() // numIntܕ val num = JInts.getWrapperIntegerNotNull()
ͳΔ΄Ͳ
ͰٯʹɺKotlinͷInt?Double?Java͔ΒͲ͏ݟ͑Δʁ
KotlinͷInt? JavaͰInterger
Kotlinͷίʔυ class KInts { companion object { @JvmStatic fun getInt():
Int = 0 @JvmStatic fun getNullableInt(): Int? = 0 } }
Javaͷίʔυ public class KIntsUsage { public static void main(String[] args)
{ int num0 = KInts.getInt(); Integer num1 = KInts.getNullableInt(); // ΞϯϘΫγϯάͰ͜͏͔͚Δ int num2 = KInts.getNullableInt(); } }
KotlinͷInt? JavaͰInterger
ͳΔ΄Ͳ
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ʂʂʂ
࠷ޙʹ
ʰ(Mutable)List<T>!ʱͱʁ
Mapped&TypeͱPla+orm&Typeͷ߹Θٕͤ
Kotlinͷ 2ͭͷϦετΠϯλʔϑΣʔε
kotlin.collec*ons.List<T> count()ͱ͔ཁૉऔಘͱ͔ReadOnlyͳϝιου͔͠ͳ͍ (ͪͳΈʹList<T>ΠϛϡʔλϒϧͰͳ͍)
kotlin.collec*ons.MutableList<T> List<T>Λܧঝ͠͞ΒʹཁૉΛมߋ͢ΔϝιουΛ࣋ͭ (clearͱ͔addͱ͔Ͱ͖Δ)
ͲͪΒJavaͰ java.u&l.List<T>
Kotlinͷίʔυ class KLists { companion object { @JvmStatic fun getStringList():
List<String> = listOf("") @JvmStatic fun getMutableStringList(): MutableList<String> = mutableListOf("") } }
Javaͷίʔυ List<String> list0 = KLists.getStringList(); List<String> list1 = KLists.getMutableStringList();
ͰJavaͷjava.u'l.List<String> Kotlin͔ΒͲ͏ݟ͑Δ?
Javaͷίʔυ public class JLists { public static List<String> getList() {
return new ArrayList<>(); } }
Kotlinͷίʔυ // IDEͰͷදࣔʰ(Mutable)List<String!>!ʱܕ val list = JLists.getList() println(list.count) // MutableListͷϝιου͕asͳ͠ͰݺΔ
list.clear() println(list.count)
MutableList͡Όͳͯ͘Listͱͯ͠ѻ͍͍ͨ߹ʁ
@ReadOnly
@ReadOnlyͱ@MutableΛ༩ͨ͠Javaͷίʔυ(@NotNull) public class JLists { @NotNull @ReadOnly public static List<String>
getReadonlyList() { return new ArrayList<>(); } @NotNull @Mutable public static List<String> getMutableList() { return new ArrayList<>(); } }
Kotlinͷίʔυ // kotlin.collections.List<String!> val list = JLists.getReadonlyList() // ͜ΕOK val
list : List<String> = JLists.getReadonlyList() // ίϯύΠϧΤϥʔ val list : MutableList<String> = JLists.getReadonlyList() println(list.count()) // OK list.clear() // ίϯύΠϧΤϥʔ @ReadOnlyͱ@MutableΛ͚ͭΔ͜ͱͰมԽ
// kotlin.collections.MutableList<String!> val list = JLists.getMutableList() // ͜ΕOK val list
: MutableList<String> = JLists.getMutableList() println(list.count()) // OK list.clear() // OK // MutableListListΛܧঝ͍ͯ͠ΔͷͰɺͭ͜͡ΕOK // ͨͩclearͱ͔addݺͳ͍ // val list : List<String> = JLists.getMutableList() @ReadOnlyͱ@MutableΛ͚ͭΔ͜ͱͰมԽ
͜ΕΒList<T>͚ͩͰͳ͘ Set<T>Map<T>Ͱ͍ͬ͠ΐ
·ͱΊ Pla$orm(TyoeͱMapped(Type ཧղ͓ͯ͜͠͏ʂ