blob: 0f9b54135f6eb52d52de6758bb5c5aa8c4e80333 (
plain) (
tree)
|
|
package hello
object world extends App {
println("hello dotty!")
trait AnimalPackage {
type Animal <: AnimalU
type AnimalU = { val age: Int }
def newAnimal(a: AnimalU): Animal
def newSubAnimal[T](a: AnimalU & T): Animal & T
}
val p: AnimalPackage = new AnimalPackage { p =>
type Animal = AnimalU
override def newAnimal(a: AnimalU): Animal = a
override def newSubAnimal[T](a: AnimalU & T): Animal & T = a
}
val lambda: p.Animal = p.newAnimal(new { val age = 1 })
trait CatPackage { pc =>
type Cat <: p.Animal & pc.CatDelta
type CatDelta = { val meow: Int }
type CatU = p.AnimalU & pc.CatDelta
def newCat(c: CatU): Cat
def newSubCat[T](c: CatU & T): Cat & T
}
val pc: CatPackage = new CatPackage { pc =>
type Cat = p.Animal & pc.CatDelta
def newCat(c: CatU): Cat = p.newSubAnimal[pc.CatDelta](c)
def newSubCat[T](c: CatU & T): Cat & T = p.newSubAnimal[pc.CatDelta & T](c)
}
val felix: pc.Cat = pc.newCat(new { val age = 1; val meow = 2 })
}
|