Java 如何使用我自己的Iterable in-Play框架模板 简而言之,这个问题
我不能在一个剧本中重复一个轻巧包装的集合!框架模板。我假设只要实现Java 如何使用我自己的Iterable in-Play框架模板 简而言之,这个问题,java,scala,playframework,twirl,Java,Scala,Playframework,Twirl,我不能在一个剧本中重复一个轻巧包装的集合!框架模板。我假设只要实现Iterable接口,就可以使用模板中的每个循环,但这似乎是错误的 我怎样才能让它工作 我所做的 我围绕java.util.Queue创建了一个简单的包装器类。我假设实现Iterable将允许我在一个游戏中使用for-each循环!框架模板 public class DecisionQueue implements Iterable<Decision> { Queue<Decision> decis
Iterable
接口,就可以使用模板中的每个循环,但这似乎是错误的
我怎样才能让它工作
我所做的
我围绕java.util.Queue创建了一个简单的包装器类。我假设实现Iterable将允许我在一个游戏中使用for-each循环!框架模板
public class DecisionQueue implements Iterable<Decision> {
Queue<Decision> decisions;
public DecisionQueue() {
decisions = new LinkedList<Decision>();
}
// redacted methods for manipulating the queue
@Override
public Iterator<Decision> iterator() {
return decisions.iterator();
}
}
public static Result getFormOutput() {
DecisionQueue decisionQueue = getDecisionQueue();
return ok(views.html.questionnaire.output.render(decisionQueue));
}
@(decisionQueue: data.DecisionQueue)
<ul>
@for(decision <- decisionQueue) // Problem here
// redacted
}
</ul>
我试图在模板中遍历包装器
public class DecisionQueue implements Iterable<Decision> {
Queue<Decision> decisions;
public DecisionQueue() {
decisions = new LinkedList<Decision>();
}
// redacted methods for manipulating the queue
@Override
public Iterator<Decision> iterator() {
return decisions.iterator();
}
}
public static Result getFormOutput() {
DecisionQueue decisionQueue = getDecisionQueue();
return ok(views.html.questionnaire.output.render(decisionQueue));
}
@(decisionQueue: data.DecisionQueue)
<ul>
@for(decision <- decisionQueue) // Problem here
// redacted
}
</ul>
@(decisionQueue:data.decisionQueue)
@对于(决策:=>play.twirl.api.HtmlFormat.Appendable):?}
[错误](扩展为){defmap(x$1:?>:=>play.twirl.api.Html):?}
[错误]请注意,隐式转换不适用,因为它们不明确:
[error]类型为[T](x:Iterable[T])Iterable[T]的对象TemplateMagic中的两个方法javaCollectionToScala
[A](i:Iterable[A])Iterable[A]类型的特征包装中的[error]和方法Iterablescalatable
[错误]可能是从decisionQueue.type到{def map(x$1:?>:=>play.twirl.api.HtmlFormat.Appendable)的转换函数:?}
[error]@for(decision您在这里混合了各种语言。您的DecisionQueue类是用Java编写的,而Twirl模板编译到Scala。这些语言是兼容的,但不透明。您试图在Java集合(LinkedList)上用Scala进行迭代.Scala不知道如何在没有帮助的情况下做到这一点,错误告诉您,它发现它试图使用隐式函数转换Java集合时存在一些歧义。您可能希望通过导入转换器并使用它们来帮助它,如下所示:
@(decisionQueue: data.DecisionQueue)
import scala.collection.JavaConversions._
<ul>
@for(decision <- decisionQueue.iterator) // Problem here
// redacted
}
</ul>
@(decisionQueue:data.decisionQueue)
导入scala.collection.JavaConversions_
@因为(decision)与Play 2.5.14有着完全相同的问题,通过添加
.asScala
,使转换显式化,解决了这个问题。我想我会分享我的解决方案,即使这个问题很老,因为它会在谷歌搜索Play iterable隐式转换的第一个位置时出现
之前
@(subscriptions: java.lang.Iterable[Subscription])
@if(subscriptions.nonEmpty) {
...
}
给我这个错误:
[error] /some/path/accountDetails.scala.html:31: type mismatch;
[error] found : subscriptions.type (with underlying type Iterable[some.package.Subscription])
[error] required: ?{def nonEmpty: ?}
[error] Note that implicit conversions are not applicable because they are ambiguous:
[error] both method javaCollectionToScala in object TemplateMagic of type [T](x: Iterable[T])Iterable[T]
[error] and method iterableAsScalaIterable in trait WrapAsScala of type [A](i: Iterable[A])Iterable[A]
[error] are possible conversion functions from subscriptions.type to ?{def nonEmpty: ?}
[error] @if(subscriptions.nonEmpty) {
[error] ^
之后
@(subscriptions: java.lang.Iterable[Subscription])
@if(subscriptions.asScala.nonEmpty) {
...
}
工程开箱即用,无需额外进口
希望能有所帮助。看起来似乎有一些Scala隐式查找魔法失败了。特别是,似乎有两种不同的隐式方法用于添加功能(可能是map
函数)到JavaIterable
使其像ScalaIterable
一样工作。我将添加Scala标记,因为这就是问题所在。我认为有两种方法可以解决:1.我的类缺少一些东西。在这种情况下,Java.util.Queue
做了什么,我的类没有做什么?2.Java的标准数据结构受到了特别的关注,无法在Play!模板中迭代我的对象。我想相信它是#1。我必须了解Scala才能让它工作吗?不知道,但另一个选择可能是通过电子邮件发送Play Framework Google组。那里有很多Java Play用户。我会尝试一下,谢谢。