为什么播放模板需要Scala类

为什么播放模板需要Scala类,scala,templates,playframework,playframework-2.0,Scala,Templates,Playframework,Playframework 2.0,以下模板通过将图像作为字节数组并将其编码为Base64来显示PNG图像: @(img: Array[Byte]) <img src="data:image/png;base64,@java.util.Base64.getEncoder.encodeToString(img)"> 但是,如果项目使用Java作为其主要语言: (lazy val root = (project in file(".")).enablePlugins(PlayScala)) (lazy val root

以下模板通过将图像作为字节数组并将其编码为Base64来显示PNG图像:

@(img: Array[Byte])
<img src="data:image/png;base64,@java.util.Base64.getEncoder.encodeToString(img)">
但是,如果项目使用Java作为其主要语言:

(lazy val root = (project in file(".")).enablePlugins(PlayScala))
(lazy val root = (project in file(".")).enablePlugins(PlayJava))
运行项目时出现以下错误:

[error] C:\Java\workspace\test\app\views\imgbase64.scala.html:2: type mismatch;
[error]  found   : Array[java.lang.Byte]
[error]  required: Array[scala.Byte]
[error] <img src="data:image/png;base64,@java.util.Base64.getEncoder.encodeToString(img)">
[error]                                                                              ^
[error] one error found
[error] (compile:compile) Compilation failed
[error]C:\Java\workspace\test\app\views\imgbase64.scala.html:2:类型不匹配;
找到[错误]:数组[java.lang.Byte]
[错误]必需:数组[scala.Byte]
[错误]
[错误]^
[错误]发现一个错误
[错误](编译:编译)编译失败
这是Scala 2.11.4和Play 2.3.6


为什么在这里,即使Play项目配置为使用Java,模板仍希望使用Scala字节而不是Java字节?

Twirl,Play模板编译器,是基于Scala的。它读入模板并生成Scala源代码。启用PlayJava并不重要,这不会改变Twirl编译器生成的内容。我建议您查看target/scala_2.X/twirl下的源代码,看看twirl生成了什么,以及scala编译器试图编译什么。Twirl可能将模板中的
Byte
解释为
scala.Byte
,并输出一个完全限定的类名。如果要使用Byte的java版本,则需要在模板中更加具体。

如果通过
@(img:Array[java.lang.Byte])完全限定类型,会发生什么情况?
?遗憾的是,没有任何更改-模板已将参数类型视为Array[java.lang.Byte],所以完全限定它并不能解决问题。我的意思是改变模板。你的意思是你得到了编译错误?一个愚蠢的问题,但是你重新启动了你的
sbt
?您是否尝试过
clean compile
?完全限定参数类型不会改变任何事情,因为模板已经看到了正确的类型(
Array[java.lang.Byte]
),请查看其显示的位置
[error]found:Array[java.lang.Byte]
。问题是它希望找到
Array[scala.Byte]
,我正在试图理解原因。谢谢你的回答。我不明白你在我的模板中说得更具体是什么意思-完全将模板参数限定为
Array[java.lang.Byte]
没有任何效果,因为模板已经将其视为这种类型(
[error]found:Array[java.lang.Byte]
),我的意思是完全将其限定为scala.Byte,如@(img:Array[scala.Byte])。编译器在期望它是该类型之后。