Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    17

    Funzionamento dei parametri

    Salve mi potete spiegare come java riconosce un metodo ambiguo?

    Siccome in teoria è semplice, non riesco ugualmente a metterlo in pratica
    Immaginiamo di avere una lista di stringhe dove ogni riga contiene i tipi dei parametri del metodo pippo:

    double,float,intero // esempio: public int pippo(double a,float b,int c) { ... }
    float,double,intero // esempio: public int pippo(float a,double b,int c) { ... }
    float,intero,long // ...
    float,long,intero // ...



    Il nostro metodo da richiamare anchesso una stringa, contiene tre interi:

    intero,intero,intero // esempio: classe.pippo(10,12,5);

    In questo caso che tipo di fattori devo prendere in considerazione per poter dire che quella disposizione di parametri(intero,intero,intero) sia ambigua o no?

    Io ho usato come esempio quella lista ma vale per tutte le combinazioni di parametri.

    grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Re: Funzionamento dei parametri

    Originariamente inviato da arasino
    Salve mi potete spiegare come java riconosce un metodo ambiguo?

    Siccome in teoria è semplice, non riesco ugualmente a metterlo in pratica
    Immaginiamo di avere una lista di stringhe dove ogni riga contiene i tipi dei parametri del metodo pippo:

    double,float,intero // esempio: public int pippo(double a,float b,int c) { ... }
    float,double,intero // esempio: public int pippo(float a,double b,int c) { ... }
    float,intero,long // ...
    float,long,intero // ...



    Il nostro metodo da richiamare anchesso una stringa, contiene tre interi:

    intero,intero,intero // esempio: classe.pippo(10,12,5);

    In questo caso che tipo di fattori devo prendere in considerazione per poter dire che quella disposizione di parametri(intero,intero,intero) sia ambigua o no?

    Io ho usato come esempio quella lista ma vale per tutte le combinazioni di parametri.

    grazie
    Oltre ai tipi dei parametri conta anche il loro ordine, negli esempi da te mostrati non noto alcuna ambiguità, non capisco a cosa ti riferisci...

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    17

    Re: Re: Funzionamento dei parametri

    Originariamente inviato da Kaamos
    Oltre ai tipi dei parametri conta anche il loro ordine, negli esempi da te mostrati non noto alcuna ambiguità, non capisco a cosa ti riferisci...
    prova a creare una classe con quei metodi
    codice:
     public class Pluto
     {
       public static int pippo(double a,float b,int c) {}
       public static int pippo(float a,double b,int c) {}
       public static int pippo(float a,int b,long c) {}
       public static int pippo(float a,long b,int c) {}
     }
    e a richiamare un metodo con tre interi:

    codice:
     ...
      Pluto.pippo(5,5,5);
     ...
    Il compilatore ti segnalerà errore perchè appunto c'è ambiguità in alcune funzioni.

    per farti capire con un esercizio più semplice:

    codice:
     public class Pluto
     {
       public static int pippo(double a,float b) {}
       public static int pippo(float a,double b) {}
     }
    richiamando:

    codice:
     ...
      Pluto.pippo(5,5);
     ...
    questa sistuazione è ambigua perchè tutti e due i metodi sono buoni per Pluto.pippo(5,5) e il compilatore non sa scegliere quello giusto segnalandomi giustamente l'errore.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Re: Re: Re: Funzionamento dei parametri

    Originariamente inviato da arasino
    prova a creare una classe con quei metodi
    codice:
     public class Pluto
     {
       public static int pippo(double a,float b,int c) {}
       public static int pippo(float a,double b,int c) {}
       public static int pippo(float a,int b,long c) {}
       public static int pippo(float a,long b,int c) {}
     }
    e a richiamare un metodo con tre interi:

    codice:
     ...
      Pluto.pippo(5,5,5);
     ...
    Il compilatore ti segnalerà errore perchè appunto c'è ambiguità in alcune funzioni.

    per farti capire con un esercizio più semplice:

    codice:
     public class Pluto
     {
       public static int pippo(double a,float b) {}
       public static int pippo(float a,double b) {}
     }
    richiamando:

    codice:
     ...
      Pluto.pippo(5,5);
     ...
    questa sistuazione è ambigua perchè tutti e due i metodi sono buoni per Pluto.pippo(5,5) e il compilatore non sa scegliere quello giusto segnalandomi giustamente l'errore.
    Sono le invocazioni ad essere ambigue lì, non le firme dei metodi: non trovando alcun metodo che accetti due int (5 è un letterale di tipo int), il linguaggio cerca di convertirlo al posto tuo, ma giustamente non sa cosa fare e la compilazione fallisce. Nell'ultimo esempio da te mostrato, dovresti essere tu a specificare i tipi dei parametri che stai passando: per chiamare il primo dovresti scrivere:
    codice:
    pippo(5.0, 5.0f)
    mentre per chiamare il secondo:
    codice:
    pippo(5.0f, 5.0)
    Questo potrebbe esserti utile: http://docs.oracle.com/javase/tutori...datatypes.html

    In alternativa ai letterali, c'è sempre il casting esplicito:
    codice:
    pippo((float) 5, (double) 5)

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    17

    Re: Re: Re: Re: Funzionamento dei parametri

    Originariamente inviato da Kaamos
    Sono le invocazioni ad essere ambigue lì, non le firme dei metodi: non trovando alcun metodo che accetti due int (5 è un letterale di tipo int), il linguaggio cerca di convertirlo al posto tuo, ma giustamente non sa cosa fare e la compilazione fallisce. Nell'ultimo esempio da te mostrato, dovresti essere tu a specificare i tipi dei parametri che stai passando: per chiamare il primo dovresti scrivere:
    codice:
    pippo(5.0, 5.0f)
    mentre per chiamare il secondo:
    codice:
    pippo(5.0f, 5.0)
    Questo potrebbe esserti utile: http://docs.oracle.com/javase/tutori...datatypes.html

    In alternativa ai letterali, c'è sempre il casting esplicito:
    codice:
    pippo((float) 5, (double) 5)
    Allora io sto realizzando un linguaggio di programmazione e devo riuscire a capire se appunto ci sono ambiguità nelle invocazioni.Quindi come fa java, anche il mio linguaggio deve essere in grado di segnalare l'errore.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Re: Re: Re: Re: Re: Funzionamento dei parametri

    Originariamente inviato da arasino
    Allora io sto realizzando un linguaggio di programmazione e devo riuscire a capire se appunto ci sono ambiguità nelle invocazioni.Quindi come fa java, anche il mio linguaggio deve essere in grado di segnalare l'errore.
    ... è una domanda?
    Per aiutarti bisogna sapere qualcosa di più del linguaggio in questione... se è una modifica di qualche linguaggio, spiegacela.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    17

    Re: Re: Re: Re: Re: Re: Funzionamento dei parametri

    Originariamente inviato da Kaamos
    ... è una domanda?
    Per aiutarti bisogna sapere qualcosa di più del linguaggio in questione... se è una modifica di qualche linguaggio, spiegacela.
    A me interessa solo sapere quali sono le regole che utilizza java per identificare quel tipo di ambiguità.

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Credo che dovresti visionare questo capitolo della Java Language Specification.

    C'è un ben preciso procedimento che viene seguito dal compilatore per decidere quale metodo invocare quando incontra una chiamata.

    Nel libro "Il Linguaggio Java, Manuale Ufficiale" di Arnold, Gosling, Holmes questo procedimento è sintetizzato molto bene... se me ne ricordo, appena torno a casa cercherò quel capitolo e lo riporterò in questa discussione.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    17
    Originariamente inviato da LeleFT
    Credo che dovresti visionare questo capitolo della Java Language Specification.

    C'è un ben preciso procedimento che viene seguito dal compilatore per decidere quale metodo invocare quando incontra una chiamata.

    Nel libro "Il Linguaggio Java, Manuale Ufficiale" di Arnold, Gosling, Holmes questo procedimento è sintetizzato molto bene... se me ne ricordo, appena torno a casa cercherò quel capitolo e lo riporterò in questa discussione.

    Ciao.
    grazie adesso controllo

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Come promesso, trascrivo la descrizione semplificata dell'algoritmo di ricerca del metodo da invocare in presenza di overloading. Per effettuare la scelta del metodo, il compilatore si basa su un algoritmo di ricerca che prevede l'individuazione del metodo più specifico; l'algoritmo segue i seguenti passi:


    1) Determina in quale classe o interfaccia debba essere cercato il metodo. Ciò dipende dalla forma di invocazione; ad es. se l'invocazione è di un metodo statico e utilizza il nome di una classe ( Math.random(); ), allora la classe in cui effettua la ricerca di "random()" è Math. Se, al contrario, il metodo non è qualificato in nessun modo ( pippo(k); ) allora deve esserci un metodo di nome "pippo" visibile nel punto d'invocazione. Tale metodo sarà definito in una particolare classe o interfaccia e tale classe o interfaccia è quella che verrà considerata per la ricerca descritta al punto 2. Da notare che è solo il nome del metodo che viene utilizzato per determinare dove fare la ricerca.

    2) Trova, all'interno di quella classe o interfaccia, tutti i metodi che si potrebbero riferire all'invocazione, ovvero tutti i metodi accessibili dotati del nome corretto, che richiedano un numero di argomenti uguale a quello degli argomenti che vengono passati e i cui parametri siano dei tipi a cui possano essere assegnati i valori dei corrispondenti argomenti. Questo procedimento prevede le seguenti 3 fasi:

    1. Viene cercata una corrispondenza senza effettuare alcuna conversione boxing e senza considerare la possibilità di disporre di un numero variabile di argomenti: cioè, il compilatore cerca un metodo il cui numero di parametri dichiarati corrisponda al numero di argomenti e i cui tipi di parametri (che siano primitivi o riferimenti) corrispondano ai rispettivi argomenti forniti (in altre parole, ciascun argomento deve essere dello stesso tipo del parametro corrispondente o di un tipo assegnabile senza l'uso di conversioni boxing).
    2. Se non viene individuata nessuna corrispondenza, la ricerca viene ampliata prendendo in considerazione, questa volta, le conversioni boxing, in modo che i tipi primitivi possano essere passati come oggetti e viceversa.
    3. Se anche così non viene individuato alcun metodo, la ricerca viene ripetuta prendendo in considerazione questa volta la possibilità di disporre di un numero variabile di argomenti, in modo che il numero di argomenti possa ora eccedere il numero di parametri dichiarati.


    3) Se qualche metodo, all'interno dell'insieme di quelli possibili individuati al passo precedente, è previsto di tipi parametri che risultano tutti assegnabili a quelli corrispondenti di un altro metodo dell'insieme, allora quest'ultimo metodo va eliminato dall'insieme, perchè risulta meno specifico. Ad esempio, se l'insieme contiene un metodo che richiede un parametro Object e un altro che richiede un parametro String, il metodo che richiede Object viene eliminato, poichè uno String può essere assegnato ad un Object e quindi il metodo che richiede uno String è più specifico. Se si passa un argomento di tipo String, si vuole che venga trattato da un metodo specializzato in stringhe, non da un metodo generale che lavora con oggetti qualunque.

    4) Se rimane solamente un metodo, questo è il più specifico e andrà invocato. Se rimangono più metodi e questi sono dotati di firme differenti, allora l'invocazione è ambigua ed il codice invocante è scorretto poichè non è possibile individuare un metodo specifico. Se tutti i metodi rimanenti sono dotati della stessa firma, ci sono diverse alternative: se sono tutti astratti, ne viene scelto uno arbitrariamente (è il caso di una classe che implementa due o più interfaccie provviste di uno stesso metodo); altrimenti, se ne esiste solo uno non astratto, lo si sceglie; altrimenti ancora l'invocazione è ambigua e non corretta.

    Questa è la "semplificazione" dell'algoritmo base di ricerca del metodo corretto in un'invocazione. Le cose si complicano quando si ha a che fare con i generics. In questo caso c'è una versione ampliata dell'algoritmo (costituito da 6 passi) per la determinazione del metodo corretto.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.