java-定义和引用Play模板签名中绑定的通用类型

我有许多排序的地图,以时间为键,并具有某种类型的值.为了说明起见,请考虑我有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&lt ;:任何].

如何定义可重用的通用类型的函数?

解决方法:

为了充实@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(...)}
上一篇:c-如何制作模板参数


下一篇:PHP-如何使用Swift Mailer读取模板?