我有一个抽象的课
abstract class Foo { def foo(a: Int): Int ... } // Usage new Foo { def foo(a: Int) = { println("Foo") a } }
我经常看到一个伴随对象,使调用者(例如Play框架)的冗长一点.
object Foo { def apply(f: Int => Int) = new Foo { def foo(a: Int) = f(a) } } // Usage Foo { a => println("Foo") a }
但是假设我将方法设为通用的
abstract class Foo { def foo(a: T): T ... } // Usage new Foo { def foo(a: T) = { println("Foo") a } }
解决方法
是的,你可以通过模拟2级多态性来做到这一点.基于
this article你可以做到:
trait ~>[F[_],G[_]] { def apply[A](a: F[A]): G[A] } type Id[A] = A abstract class Foo { def foo[T](a: T): T } object Foo { def apply(f: Id ~> Id) = new Foo { def foo[T](a: T): T = f(a) } } val fun = new (Id ~> Id) { def apply[T](a: T): T = { println("Foo"); a } } val foo = Foo(fun) foo.foo(1) foo.foo("String")