scala – Play Framework模板中的有界通用参数
发布时间:2020-12-16 09:59:55 所属栏目:安全 来源:网络整理
导读:如何在Play Framework 2.3 Java项目中的Scala模板中使用有界通用参数? 我目前有类似的东西: @(entities: List[_ : Entity],currentEntity: Entity)ul @for(entity - entities) { @if(currentEntity.equals(entity)) { listrong@entity/strong/li } else {
如何在Play Framework 2.3
Java项目中的Scala模板中使用有界通用参数?
我目前有类似的东西: @(entities: List[_ <: Entity],currentEntity: Entity) <ul> @for(entity <- entities) { @if(currentEntity.equals(entity)) { <li><strong>@entity</strong></li> } else { <li>@entity</li> } } </ul> 但是,我可以在实体和currentEntity中使用不同类型的实体来调用它 – 这不是很好.我想做的事情如下: @[T <: Entity](entities: List[T],currentEntity: T) ... 但这给了我无效的’@’符号作为编译错误. 解决方法
正如@ m-z指出的那样,它还没有得到支持.但是,您可以通过首先将参数编组到View对象中来获得所需的类型安全性(以另一类类别为代价):
case class HighlightedListView[E <: Entity](entities:List[E],currentEntity:E) 现在在您的控制器中,加载一个新的HighlightedListView实例,而不是直接将参数提供给模板: def foo = Action { ... // Assuming some SubEntity exists,the compiler will enforce the typing: val hlv = HighlightedListView[SubEntity](entities,currentEntity) Ok(html.mytemplate(hlv)) } 正如评论所述,如果您的类型没有对齐,编译器将会禁止.然后模板可以非常宽松,因为我们知道我们是安全的: @(hlv:HighlightedListView[_]) <ul> @for(entity <- hlv.entities) { @if(hlv.currentEntity.equals(entity)) { <li><strong>@entity</strong></li> } else { <li>@entity</li> } } </ul> 您甚至可以利用新的View对象添加辅助方法,这样可以使模板更易于阅读,并便于单元测试: case class HighlightedListView[E <: Entity](entities:List[E],currentEntity:E) { def shouldHighlight(e:Any):Boolean = currentEntity.equals(e) } 导致: @if(hlv.shouldHighlight(entity)) { <li><strong>@entity</strong></li> } else { <li>@entity</li> } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |