我不能在 Play中迭代一个包裹得很轻的集合!框架模板。我假设只是实现Iterable
接口将使我能够在模板中使用for-each循环,但这似乎是不正确的。
我怎样才能使这个工作?
我在java.util.Queue周围创建了一个简单的包装类。我假设实现Iterable会允许我在 Play中使用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>
我在编译期间得到了以下堆栈跟踪。
[error] C:\...\app\views\questionnaire\output.scala.html:12: type mismatch;
[error] found : decisionQueue.type (with underlying type models.data.DecisionQueue)
[error] required: ?{def map(x$1: ? >: <error> => play.twirl.api.HtmlFormat.Appendable): ?}
[error] (which expands to) ?{def map(x$1: ? >: <error> => play.twirl.api.Html): ?}
[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 decisionQueue.type to ?{def map(x$1: ? >: <error> => play.twirl.api.HtmlFormat.Appendable): ?}
[error] @for(decision <- decisionQueue) {
[error] ^
[error] one error found
[error] (compile:compile) Compilation failed
如果我将底层Queue直接传递给模板而不是使用包装器,它就可以工作。
答案 0 :(得分:1)
你在这里混合语言。您的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>
答案 1 :(得分:0)
与Play 2.5.14完全相同的问题,并通过添加.asScala
使转换显式来修复它。以为我会分享我的解决方案,即使这个问题已经过时了,因为在第一个位置使用Google play iterable implicit conversion ambiguous
时会显示该问题。
<强>之前强>
@(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) {
...
}
为我开箱即用,无需额外进口。
希望它有所帮助。