+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Nouveau Membre du Club
    Inscrit en
    novembre 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 38
    Points : 33
    Points
    33

    Par défaut Type structurel avec Int

    bonjour,

    je voudrais utiliser un type structurel pour utiliser indifféremment un Int par exemple et une classe que j'ai créé:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    object Main {
     
        type AdditionneAvecInt = {
            def +(v: Int): Int
        }
     
        class MonInt(val i: Int) {
     
            def +(v: Int): Int = i + v
        }
     
        def additionner(a: AdditionneAvecInt, b: Int) = a + b
     
        def main(args: Array[String]) = {
            println(additionner(new MonInt(1), 1))
            //println(additionner(1, 1))
        }
    }
    MonInt est bien reconnue comme un type AdditionneAvecInt, mais pas Int (la ligne commentée ne compile pas), alors qu'elle a bien une méthode +(Int): Int : http://www.scala-lang.org/api/curren...html#scala.Int

    le compilateur retourne ça:

    Test.scala:16: error: type mismatch;
    found : Int(1)
    required: Main.AdditionneAvecInt
    println(additionner(1, 1))
    ^
    one error found
    c'est possible d'utiliser un Int?

    merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : mai 2009
    Messages : 98
    Points : 304
    Points
    304

    Par défaut

    Le code que tu nous présentes et celui qui se fait compiler n'est pas le même

    Dans un premier temps, tu as:
    Code :
    1
    2
     
    println(additionner(new MonInt(1), 1))
    Puis ça passe à
    Code :
    1
    2
     
    println(additionner(1, 1))
    Qui heureusement "bashé" par le compilateur.

    Vérifie bien que tes fichiers soient bien synchro.

  3. #3
    Nouveau Membre du Club
    Inscrit en
    novembre 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 38
    Points : 33
    Points
    33

    Par défaut

    je vois pas trop ce que tu veux dire...
    j'ai mis les 2 lignes (avec dans un cas "new MonInt(1)" et dans l'autre "1") pour montrer que dans un cas ça fonctionne et pas dans l'autre, alors que selon moi, s'il n'y a pas de subtilité technique que je ne connais pas, ça devrait (si j'ai bien compris les types structurels).

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : mai 2009
    Messages : 98
    Points : 304
    Points
    304

    Par défaut

    Test.scala:16: error: type mismatch;
    found : Int(1)
    required: Main.AdditionneAvecInt
    println(additionner(1, 1))
    ^
    one error found
    Regarde bien le premier paramètre de la méthode "additionner"

  5. #5
    Membre chevronné Avatar de AuraHxC
    Homme Profil pro
    Doctorant
    Inscrit en
    mai 2006
    Messages
    627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Doctorant

    Informations forums :
    Inscription : mai 2006
    Messages : 627
    Points : 603
    Points
    603

    Par défaut

    Ben ça parait normal puisqu'il te dit que ça fonctionne avec sa classe Int mais pas avec la classe Int de Scala et qu'il ne comprend pas pourquoi !!!
    L'erreur à la compilation qu'il a donné c'est avec le cas où il passe la classe Int de Scala même si dans son code c'est en commentaire, c'est pas le cœur du problème.

    Donc en définitive, il demande pourquoi cela fonctionne avec sa classe et pas avec celle de Scala.
    Je n'ai pas la réponse pour l'instant désolé, il faudrait que je regarde de plus près mais j'ai pas vraiment le temps et certainement pas assez de connaissances en Scala.

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : mai 2009
    Messages : 98
    Points : 304
    Points
    304

    Par défaut

    Effectivement, j'avais mal compris. Voila comment régler le problème.

    Quand tu définis structurellement un type, le type par défaut sera AnyRef (l'équivalent de java.lang.Object). scala.Int étend de la classe scala.AnyVal (qui représente les types primitifs en java)

    Dans ton cas le compilateur s'énerve car tu lui passe un AnyVal alors qu'il attend un AnyRef.

    Tu peux contourner le problème en déclarant ton alias comme ça

    Code :
    1
    2
    3
    4
     
    type AdditionneAvecInt = Any {
       def +(v: Int): Int
     }
    Tu prendras en compte tous les AnyRef et AnyVal qui définissent la méthode +

  7. #7
    Nouveau Membre du Club
    Inscrit en
    novembre 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 38
    Points : 33
    Points
    33

    Par défaut

    merci beaucoup! et désolé de pas avoir été clair.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •