Tomcat 7でScalaを使用する場合、HttpServletRequest.getHeaderNames()は、ドキュメントに示されているように、java.util.Enumerationではなくjava.util.Collectionを返すようです。
ここで暗黙の変換が発生しますか?
具体的には、次のサーブレットです。
import java.io._
import javax.servlet._
import javax.servlet.http._
class TomcatScalaExample extends HttpServlet {
override def doGet (req: HttpServletRequest, res: HttpServletResponse): Unit = {
val out = res.getWriter()
out.println(res.getHeaderNames.getClass.getCanonicalName)
out.close()
}
}
ブラウザで次のように出力します。
java.util.ArrayList
java.util.Enumerationに関連する何かを期待していますが。
参考までに、-Xprint:typerでコンパイルされたコードは次のとおりです。
[scalac] package pl.kamituel.tomcatscalaexample {
[scalac] import java.io._;
[scalac] import javax.servlet._;
[scalac] import javax.servlet.http._;
[scalac] class TomcatScalaExample extends javax.servlet.http.HttpServlet {
[scalac] def <init>(): pl.kamituel.tomcatscalaexample.TomcatScalaExample = {
[scalac] TomcatScalaExample.super.<init>();
[scalac] ()
[scalac] };
[scalac] override def doGet(req: javax.servlet.http.HttpServletRequest, res: javax.servlet.http.HttpServletResponse): Unit = {
[scalac] val out: java.io.PrintWriter = res.getWriter();
[scalac] out.println(res.getHeaderNames().getClass().getCanonicalName());
[scalac] out.close()
[scalac] }
[scalac] }
[scalac] }
[scalac]