Skip to content

Instantly share code, notes, and snippets.

@lgzh1215
Last active November 6, 2018 17:17
Show Gist options
  • Select an option

  • Save lgzh1215/662f76976b3f9f39e92eb5b028e730ea to your computer and use it in GitHub Desktop.

Select an option

Save lgzh1215/662f76976b3f9f39e92eb5b028e730ea to your computer and use it in GitHub Desktop.
关于phantom type的一个简陋的kotlin的例子,作用如main所示
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()
@RubiTree
Copy link
Copy Markdown

RubiTree commented Nov 6, 2018

萌雀巨佬赛高!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment