existentials.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 103 行

SCALA
103
字号
class Foo {  class Line {    case class Cell[T](var x: T)    def f[T](x: Any): Cell[t1] forSome { type t1 } = x match { case y: Cell[t] => y }        var x: Cell[T] forSome { type T } = new Cell(1)    println({ x = new Cell("abc"); x })  }}class FooW {  class Line {    case class Cell[T](var x: T)    def f[T](x: Any): Cell[ _ ] = x match { case y: Cell[t] => y }        var x: Cell[_] = new Cell(1)    println({ x = new Cell("abc"); x })  }}trait Counter[T] {   def newCounter: T   def get(i: T): Int   def inc(i: T): T}case class C[T](x: T)object LUB {  def x = C(1)  def y = C("abc")  var coinflip: boolean = _  def z = if (coinflip) x else y  def zz: C[_1] forSome { type _1 >: Int with java.lang.String } = z  def zzs: C[_ >: Int with java.lang.String] = z}object Bug1189 {  case class Cell[T](x: T)  type U = Cell[T1] forSome { type T1 }  def f(x: Any): U = x match { case y: Cell[_] => y }  var x: U = Cell(1)  println(x)  println(f(x))  x = Cell("abc")  println(x)  println(f(x))}object Test extends Application {  val x = { class I[T]; (new C(new I[String]), new C(new I[Int])) }  val y: (C[X], C[Y]) forSome { type X; type Y } = x   def foo(x : Counter[T] { def name : String } forSome { type T }) = x match {     case ctr: Counter[t] =>       val c = ctr.newCounter       println(ctr.name+" "+ctr.get(ctr.inc(ctr.inc(c))))     case _ =>   }   def fooW(x : Counter[T] { def name : String } forSome { type T }) = x match {     case ctr: Counter[t] =>       val c = ctr.newCounter       println(ctr.name+" "+ctr.get(ctr.inc(ctr.inc(c))))     case _ =>   }   var ex: Counter[T] forSome { type T } = _   ex = ci   ex = cf   var exW: Counter[_] = _   ex = ci   ex = cf   val ci = new Counter[Int] {     def newCounter = 0     def get(i: Int) = i     def inc(i: Int) = i+1     def name = "Int"   }   val cf = new Counter[Float] {     def newCounter = 0     def get(i: Float) = i.intValue     def inc(i: Float) = i+1     def name = "Float"   }   foo(ci)   foo(cf)   fooW(ci)   fooW(cf)   val foo = new Foo   new foo.Line   val fooW = new FooW   new fooW.Line}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?