2014-01-31 4 views
1

Я не могу создать класс, представляющий XML-анализируемый документ, используя объект-компаньон.Scala - comanion object & apply: непонятная ошибка

Вот код класса:

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 

I просто не понимаю эту ошибку (и как я могу ее удалить).

спасибо!

ответ

5

Ваш метод подачи - это процедура. Изменить его на apply(fichier: String): ElémentXML = ....

Перегрузка с применением синтетического случая разрешена ожидаемым типом.

Это почему синтаксис процедура устареет:

[email protected]:~/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 

Один любопытный эффект это последняя линия работает по значению отбрасывание:

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 =() 
+1

привет, жаль, что я не очень хорошо понял ваш ответ ; Какая должна быть правильная строка кода для моего метода? – lolveley

+1

Вам нужно '=' после 'def apply (fichier: String)', поэтому оно возвращает значение. – Kigyo

+0

thanks.it работает – lolveley