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
      函数)到Java
      Iterable
      使其像Scala
      Iterable
      一样工作。我将添加Scala标记,因为这就是问题所在。我认为有两种方法可以解决:1.我的类缺少一些东西。在这种情况下,
      Java.util.Queue
      做了什么,我的类没有做什么?2.Java的标准数据结构受到了特别的关注,无法在Play!模板中迭代我的对象。我想相信它是#1。我必须了解Scala才能让它工作吗?不知道,但另一个选择可能是通过电子邮件发送Play Framework Google组。那里有很多Java Play用户。我会尝试一下,谢谢。