Last active
November 6, 2018 17:17
-
-
Save lgzh1215/662f76976b3f9f39e92eb5b028e730ea to your computer and use it in GitHub Desktop.
关于phantom type的一个简陋的kotlin的例子,作用如main所示
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| fun main(): Unit = with(SomeBuilder) { | |
| SomeBuilder.getBuilder().setS2("2").setS1("1").buildSome() // ok | |
| SomeBuilder.getBuilder().setS1("1").setS2("2").buildSome() // ok | |
| SomeBuilder.getBuilder().setS1("1").buildSome() // error | |
| SomeBuilder.getBuilder().setS2("2").buildSome() // error | |
| SomeBuilder.getBuilder().buildSome() // もerror | |
| } | |
| class Some(val s1: String, val s2: String) | |
| class SomeBuilder<T : State, U : State> private constructor() { | |
| private lateinit var s1: String | |
| private lateinit var s2: String | |
| companion object { | |
| fun getBuilder() = SomeBuilder<NotReady, NotReady>() | |
| fun <T : State, U : State> SomeBuilder<T, U>.setS1(s1: String) = this.apply { this.s1 = s1 } as SomeBuilder<S1Ready, U> | |
| fun <T : State, U : State> SomeBuilder<T, U>.setS2(s2: String) = this.apply { this.s2 = s2 } as SomeBuilder<T, S2Ready> | |
| fun SomeBuilder<S1Ready, S2Ready>.buildSome() = Some(this.s1, this.s2) | |
| } | |
| } | |
| sealed class State | |
| object S1Ready : State() | |
| object S2Ready : State() | |
| object NotReady : State() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
萌雀巨佬赛高!