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(...)}

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...