Xml Scala–;伴生物体&;应用:不可理解的错误

Xml Scala–;伴生物体&;应用:不可理解的错误,xml,scala,companion-object,Xml,Scala,Companion Object,我无法使用伴生对象创建表示XML解析文档的类 下面是该类的代码: package models import javax.xml.bind.Element import scala.xml.Elem import javax.xml.validation.SchemaFactory import javax.xml.transform.stream.StreamSource trait MyXML { case class ElémentXML(code_xml: scala.xml.E

我无法使用伴生对象创建表示XML解析文档的类

下面是该类的代码:

package models

import javax.xml.bind.Element
import scala.xml.Elem
import javax.xml.validation.SchemaFactory
import javax.xml.transform.stream.StreamSource


trait MyXML {

case class ElémentXML(code_xml: scala.xml.Elem) {

def validate: Boolean = {

try ({
  val schemaLang = "http://www.w3.org/2001/XMLSchema"
  val factory = SchemaFactory.newInstance(schemaLang)
  val schema = factory.newSchema(new StreamSource("Sites_types_libelles.xsd"))
  val validator = schema.newValidator()
  validator.validate(new StreamSource(code_xml.toString))
  true
}) catch {
  case t:Throwable => false
}
}



}

object ElémentXML {

def apply(fichier: String) {

  try{
  val xml_chargé = xml.XML.loadFile(fichier)
  Some(new ElémentXML(xml_chargé))
  }catch{
    case e:Throwable => None
  }
}
}

}
下面是使用此类的应用程序的代码:

val xml1:ElémentXML = ElémentXML("app/models/exemple_bon.xml")
xml1 must not beEqualTo(None)
错误是:

type mismatch; found : String("app/models/exemple_bon.xml") required: 
 scala.xml.Elem
我只是不理解这个错误(以及如何删除它)


谢谢

应用方法是一个过程。将其修改为
apply(fichier:String):ElémentXML=…

应用合成案例时的过载由预期类型解决

以下是不推荐使用过程语法的原因:

apm@mara:~/tmp$ scala -Xfuture -deprecation
Welcome to Scala version 2.11.0-20140129-135431-0e578e6931 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def f() { }
<console>:1: warning: Procedure syntax is deprecated. Convert procedure `f` to method by adding `: Unit =`.
       def f() { }
               ^
<console>:7: warning: Procedure syntax is deprecated. Convert procedure `f` to method by adding `: Unit =`.
       def f() { }
               ^
f: ()Unit
apm@mara:~/tmp$scala-Xfuture-deprecation
欢迎使用Scala版本2.11.0-20140129-135431-0e578e6931(OpenJDK 64位服务器虚拟机,Java 1.7.0_25)。
键入要计算的表达式。
键入:有关详细信息的帮助。
scala>def(){}
:1:警告:不推荐使用过程语法。通过添加“:Unit=”,将过程“f”转换为方法。
def(){}
^
:7:警告:不推荐使用过程语法。通过添加“:Unit=”,将过程“f”转换为方法。
def(){}
^
f:()单位
这其中一个奇怪的效果是,最后一行通过值丢弃工作:

scala> :pa
// Entering paste mode (ctrl-D to finish)

case class C(c: Int)
object C {
def apply(s: String): Unit = C(s.toInt)
}

// Exiting paste mode, now interpreting.

defined class C
defined object C

scala> C(4)
res2: C = C(4)

scala> C("4")

scala> val x: C = C(4)
x: C = C(4)

scala> val x: C = C("4")
<console>:11: error: type mismatch;
 found   : String("4")
 required: Int
       val x: C = C("4")
                    ^

scala> val x: Unit = C("4")
x: Unit = ()

scala> val x: Unit = C(4)  // works silently
x: Unit = ()
scala>:pa
//进入粘贴模式(按ctrl-D键完成)
案件类别C(C:Int)
对象C{
def应用(s:字符串):单位=C(s.toInt)
}
//正在退出粘贴模式,现在正在解释。
定义的C类
定义对象C
scala>C(4)
res2:C=C(4)
scala>C(“4”)
scala>valx:C=C(4)
x:C=C(4)
scala>valx:C=C(“4”)
:11:错误:类型不匹配;
找到:字符串(“4”)
必填项:Int
val x:C=C(“4”)
^
scala>valx:Unit=C(“4”)
x:单位=()
scala>valx:Unit=C(4)//静默工作
x:单位=()

应用方法是一个过程。将其修改为
apply(fichier:String):ElémentXML=…

应用合成案例时的过载由预期类型解决

以下是不推荐使用过程语法的原因:

apm@mara:~/tmp$ scala -Xfuture -deprecation
Welcome to Scala version 2.11.0-20140129-135431-0e578e6931 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def f() { }
<console>:1: warning: Procedure syntax is deprecated. Convert procedure `f` to method by adding `: Unit =`.
       def f() { }
               ^
<console>:7: warning: Procedure syntax is deprecated. Convert procedure `f` to method by adding `: Unit =`.
       def f() { }
               ^
f: ()Unit
apm@mara:~/tmp$scala-Xfuture-deprecation
欢迎使用Scala版本2.11.0-20140129-135431-0e578e6931(OpenJDK 64位服务器虚拟机,Java 1.7.0_25)。
键入要计算的表达式。
键入:有关详细信息的帮助。
scala>def(){}
:1:警告:不推荐使用过程语法。通过添加“:Unit=”,将过程“f”转换为方法。
def(){}
^
:7:警告:不推荐使用过程语法。通过添加“:Unit=”,将过程“f”转换为方法。
def(){}
^
f:()单位
这其中一个奇怪的效果是,最后一行通过值丢弃工作:

scala> :pa
// Entering paste mode (ctrl-D to finish)

case class C(c: Int)
object C {
def apply(s: String): Unit = C(s.toInt)
}

// Exiting paste mode, now interpreting.

defined class C
defined object C

scala> C(4)
res2: C = C(4)

scala> C("4")

scala> val x: C = C(4)
x: C = C(4)

scala> val x: C = C("4")
<console>:11: error: type mismatch;
 found   : String("4")
 required: Int
       val x: C = C("4")
                    ^

scala> val x: Unit = C("4")
x: Unit = ()

scala> val x: Unit = C(4)  // works silently
x: Unit = ()
scala>:pa
//进入粘贴模式(按ctrl-D键完成)
案件类别C(C:Int)
对象C{
def应用(s:字符串):单位=C(s.toInt)
}
//正在退出粘贴模式,现在正在解释。
定义的C类
定义对象C
scala>C(4)
res2:C=C(4)
scala>C(“4”)
scala>valx:C=C(4)
x:C=C(4)
scala>valx:C=C(“4”)
:11:错误:类型不匹配;
找到:字符串(“4”)
必填项:Int
val x:C=C(“4”)
^
scala>valx:Unit=C(“4”)
x:单位=()
scala>valx:Unit=C(4)//静默工作
x:单位=()

您好,对不起,我没有很好地理解您的回答;我的方法应用的正确代码行应该是什么?在
def apply(fichier:String)
之后需要一个
=
,因此它会返回一个值。您好,抱歉,我没有很好地理解您的答案;我的方法应用的正确代码行应该是什么?在
def apply(fichier:String)
之后需要一个
=
,这样它就会返回一个值。