IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scala Java Discussion :

Type structurel avec Int


Sujet :

Scala Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 44
    Points
    44
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    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 : 97
    Points : 307
    Points
    307
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    println(additionner(new MonInt(1), 1))
    Puis ça passe à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    println(additionner(1, 1))
    Qui heureusement "bashé" par le compilateur.

    Vérifie bien que tes fichiers soient bien synchro.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 44
    Points
    44
    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 averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    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 : 97
    Points : 307
    Points
    307
    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 éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Points : 683
    Points
    683
    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 averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    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 : 97
    Points : 307
    Points
    307
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 44
    Points
    44
    Par défaut
    merci beaucoup! et désolé de pas avoir été clair.

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

Discussions similaires

  1. ODBC Access => Type Incompatible avec un champ DATE ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 6
    Dernier message: 23/04/2005, 02h02
  2. [VB.NET] Variable de type enum avec du string
    Par Mouse dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/01/2005, 18h22
  3. Comment Enregistrer un champ type BLOB avec Query ???
    Par baba dans le forum Bases de données
    Réponses: 3
    Dernier message: 11/01/2005, 20h33
  4. [LG]Type chaine avec plus de 255 car et EOF intempestif.
    Par jpclabaux dans le forum Langage
    Réponses: 2
    Dernier message: 27/10/2004, 10h39
  5. Type pour données de type email avec @
    Par jeff37 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/01/2004, 14h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo