我有一个抽象的课
abstract class Foo {
def foo(a: Int): Int
...
}
// Usage
new Foo {
def foo(a: Int) = {
println("Foo")
a
}
}
Run Code Online (Sandbox Code Playgroud)
我经常看到一个伴随对象,使调用者(例如Play框架)的冗长一点.
object Foo {
def apply(f: Int => Int) = new Foo {
def foo(a: Int) = f(a)
}
}
// Usage
Foo { a =>
println("Foo")
a
}
Run Code Online (Sandbox Code Playgroud)
但是假设我将方法设为通用的
abstract class Foo {
def foo(a: T): T
...
}
// Usage
new Foo {
def foo(a: T) = {
println("Foo")
a
}
}
Run Code Online (Sandbox Code Playgroud)
我还可以使用伴随对象,即我可以将泛型类型参数应用于函数,而不是方法或类吗?
是的,你可以通过模拟rank 2多态来做到这一点.根据这篇文章你可以做到:
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")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1570 次 |
| 最近记录: |