2014-01-17 4 views
0

일반 매개 변수가있는 추상 클래스와이 클래스를 구현하는 구체적인 플러그인을 구현하고 싶습니다. myPlugin이 매개 변수 (유형 삭제로 모든 유형을 사용하여 발견되기 때문에,이 발생하지 않습니다 물론Playframework 플러그인 및 제네릭

val plugin = app.plugin[BasePlugin[String]] 
//Ok, plugin = Some(MyPlugin) 

val plugin = app.plugin[BasePlugin[Int]] 
//KO, plugin = None 

: 예를 들어

:

abstract class BasePlugin[T] extends Plugin { 
    def d: T 
} 

class MyPlugin(app: Application) extends BasePlugin[String] { 
    val d = "test" 
} 

내 욕망은 다음과 달성하는 것입니다?). 어쨌든 나는 위의 것을 얻기위한 기술을 찾는데 매우 효과적 일 것입니다. 어떤 생각?

+0

스칼라가 ClassTag이라는 것을,이 응용 프로그램을 컴파일 할 때이 가능하더라도 유형 정보를 보유 할 수 있습니다. scala 2.10 이전에 Manifest라고 불렀습니다. 어쩌면 문제를 해결하는 데 사용할 수 있을까요?! –

답변

1

play 플러그인 api는 Java의 일부인 플러그인을 찾을 때 Class.isAssignableFrom을 사용하므로 Scala에 ClassTag/TypeTags가있는 데 도움이되지 않습니다.

아마 당신은 뭔가를 자신의 서브 플러그인 형식을 만들 수 있습니다

trait SubPlugin[T] { 
    def doSomething(t: T) {} 
} 

trait MetaPlugin { 

    private val subPlugins: Seq[(Class[_], SubPlugin[_])] = ??? 

    def subPlugin[T](implicit classTag: ClassTag[T]): Option[SubPlugin[T]] = { 
    subPlugins.collectFirst { 
     case (c, p) if c.isAssignableFrom(classTag.runtimeClass) => p.asInstanceOf[SubPlugin[T]] 
    } 
    } 
} 

object MetaPlugin { 

    def apply[T](implicit app: play.api.Application, classTag: ClassTag[T]): Option[SubPlugin[T]] = 
    app.plugin[MetaPlugin].flatMap(_.subPlugin[T]) 

} 


object AndThenSomeWhere { 
    import play.api.Play.current 
    MetaPlugin[String].map(_.doSomething("a string")) 
}