1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
trait TreesBase {
type Tree
type Apply <: Tree
val Apply: ApplyExtractor
abstract class ApplyExtractor {
def apply(x: Int): Apply
def unapply(apply: Apply): Option[Int]
}
}
trait TreesApi extends TreesBase {
def Apply(x: String)
}
class Universe extends TreesApi {
abstract class Tree
case class Apply(x: Int) extends Tree
object Apply extends ApplyExtractor
def Apply(x: String) = Apply(x.toInt)
}
object Test extends App {
def foo(tapi: TreesApi) {
import tapi._
def bar(tree: Tree) {
val Apply(x) = tree
}
}
}
|