2010-07-06 22 views
1

J'ai cette classe de cas définissent:Une classe de cas, héritant d'une classe, a des problèmes étant utilisés en tant que paramètre constructeur

class Protocol(protocol:String) 

object Protocol { 
    def apply(protocol:String) :Protocol = { 
     protocol.toUpperCase match { 
     case "HTTP" => Http() 
     case "HTTPS" => Https() 
     case "Ftp" => Ftp() 
     case "Mail" =>Mail() 
     case other => new Protocol(other) 
    } 
} 
} 

case class Http() extends Protocol("HTTP") {} 

que j'utilise ensuite dans cette classe de cas:

case class Url(protocol: Protocol, 
    username: Option[String], 
    password: Option[String], 
    domainName: DomainName, 
    port: Option[Int], 
    path: Option[List[String]], 
    parameters: Option[List[Parameter]]) { 

et puis essayez d'utiliser ici:

"An url class" should { 
    "represent http://localhost" in { 
     val url = Url(Http, None, None, localhost, None, None, None) 
      url.toString must beEqualTo("http://localhost") 
    } 

pour que j'obtenir l'erreur du compilateur déconcertante suivante:

[error] C:\Users\Jim.Barrows\Desktop\workspaces\utils\src\test\scala\UrlSpec.scala:16: type mismatch; 
[error] found : bizondemand.utils.models.internet.Http.type (with underlying type object bizondemand.utils.models.internet.Http) 
[error] required: bizondemand.utils.models.internet.Protocol 
[error]       val url = Url(Http, None, None, localhost, None, None, None) 

Qu'est-ce que je fais mal?

Répondre

7

L'erreur est ici:

Url(Http, None, None, localhost, None, None, None) 
    ^^^^ 

Depuis que vous avez défini Http en tant que classe, pas un objet, vous devez faire Http() pour créer une instance. Ou encore mieux: définissez Http comme un objet de cas en premier lieu.

Il est généralement préférable d'utiliser des objets de cas plutôt que des classes de cas sans arguments.