我有许多排序的地图,以时间为键,并具有某种类型的值.为了说明起见,请考虑我有3张地图(使用Java):
SortedMap<OffsetDateTime, Foo> foo;
SortedMap<OffsetDateTime, Boo> bar;
SortedMap<OffsetDateTime, Baz> baz;
我希望编写一个通用的Play模板,该模板接受地图和渲染器功能,并输出每一对.
在模板中,我可以使用以下签名定义局部函数:
@renderTrace[T <: Any](trace: ImmutableSortedMap[OffsetDateTime, Option[T]], renderer: (T) => Html) = {
但是,我想在多个模板中使用此函数,所以我不想在本地定义它.相反,我希望将其定义为自己的模板(在RenderTrace.scala.html中).
不幸的是,我似乎无法在模板签名中指定类型构造[T< ;:任何].
如何定义可重用的通用类型的函数?
解决方法:
为了充实@Ashalynd的建议,模板编译器似乎不足以处理类型参数.有时,您可以使用下划线作为类型参数(仅当您不关心类型是什么时),但这不是这种情况之一.
Play(现在称为twirl)模板本质上只是一个产生play.twirl.api.Html类型的结果(或Play 2.2的play.api.templates.Html)的函数.模板编译器需要解决,因此定义一个包含您的函数的帮助程序包:
package viewhelpers
import play.twirl.api.Html // play.api.templates.Html for 2.2
object ViewExtension {
def renderTrace[T <: Any](trace: ImmutableSortedMap[OffsetDateTime, Option[T]], renderer: (T) => Html): Html = ...
}
renderTrace的实现可能看起来不像视图模板中那样好,但至少现在可以正常工作.
然后在视图中:
@(someParams: ....)
@import viewhelpers.ViewExtension
@{ViewExtension.renderTrace(...)}