2014-11-28 3 views
4

는 내가 자주 동반자 객체 (예를 들어, 재생 프레임 워크) 호출자이 조금 덜 장황하게 볼스칼라 일반적인 기능

abstract class Foo { 
    def foo(a: Int): Int 
    ... 
} 

// Usage 
new Foo { 
    def foo(a: Int) = { 
    println("Foo") 
    a 
    } 
} 

추상 클래스를 가지고있다.

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 
    } 
} 

난 아직도 동반자 객체를 사용할 수 있도록 가정 차라리 메소드 나 클래스보다, 함수에 제네릭 형식 매개 변수를 적용 할 수 있는가?

답변

5

rank 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") 
+0

@PaulDraper - 그래서 'Foo.foo'가 제너릭이되기를 원하십니까? – Lee

+0

@PaulDraper - 확인. 업데이트를 참조하십시오. – Lee