package foo trait Test[T] { type Check[T] = Array[T] => Unit; type MyPair[S] = Pair[T, S] val pair1: Pair[T, Int] val pair: MyPair[Int] = pair1 def check(xs: Array[T], c: Check[T]) = c(xs) def check2[S](xs: Array[S], c: Check[S]) = c(xs) } object main extends Test[Int] { val pair1 = (1,1) implicit def topair(x: Int): Pair[Int, Int] = (x,x) val pair2: MyPair[Int] = 1 val x: short = 1 }