Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Problema con i generici...

    Ciao a tutti ragazzi,

    Sono incappato nuovamente in un bel problema con i tipi generici. Vi riporto ora il testo dell'esercizio, il codice e gli errori in compilazione, in modo da farvi capire bene tutto.

    codice:
    import jbook.util.Input; import java.io.InputStreamReader; import java.io.BufferedReader ; import java.io.IOException; import static java.lang.Math.*; import static java.lang.Object.*; import java.util.ArrayList; import java.math.BigInteger; import java.io.*; import java.util.ArrayList; import java.util.Arrays; import java.lang.reflect.Array; /* CAP 8 es. 15 Si scriva una versione generica della ricerca binaria, sia in versione iterativa (6.6.5) che ricorsiva (8.6.2); i due metodi dovranno funzionare su array dello stesso tipo dell'elemento cercato. */ @SuppressWarnings({"unchecked"}) public class OttoQuindici<T> { public static void main(String []args) { //System.out.println("Sce"); String scelta=Input.readString("Scegli tra vettore String o numerico:(String/Int) "); String[] box1= new String[]{"cane","ero","porsche","satana","apple","musica","awanagana"}; int[] box2=new int[]{2,4,5,6,11,12,34,54}; if(scelta=="String") { for(int i =0;i<box1.length;i++) { System.out.print(box1[i]+" "); } String[] c = new String[50]; String[] cerca = new String[50]; //T[] cerca= new Object[1]; cerca[0]="5"; OttoQuindici<String> OttoQuindici = new OttoQuindici<String>(); c =OttoQuindici.binaria(box1, cerca, String.class); } else { for(int i =0;i<box2.length;i++) { System.out.print(box2[i]+" "); } } } public T[] binaria(T[] elementi, T[] ricerca,Class<T> clazz) { T[] risultato = (T[]) Array.newInstance(clazz, 50); int inferiore=0; int superiore=0; int meta=0; int i =0; int trovato=0; //T[] ricerca=new Object[1]; superiore=elementi.length; do{ meta=(superiore+inferiore)/2; if((superiore+inferiore)%2!=0) { meta=meta+1; } if(ricerca[0].compareTo(elementi[i])==0){ trovato=1; risultato[0]=elementi[i]; } if(ricerca[0].compareTo(elementi[i])<0&&trovato==0) { superiore=meta; }else { inferiore=meta; } i=i+1; }while(inferiore!=superiore||trovato!=1); return risultato; } }

    Mentre di seguito lo stack degli errori:

    OttoQuindici.java:67: error: cannot find symbol
    if(ricerca[0].compareTo(elementi[i])==0){
    ^
    symbol: method compareTo(T)
    location: class Object
    where T is a type-variable:
    T extends Object declared in class OttoQuindici
    OttoQuindici.java:71: error: cannot find symbol
    if(ricerca[0].compareTo(elementi[i])<0&&trovato==0)
    ^
    symbol: method compareTo(T)
    location: class Object
    where T is a type-variable:
    T extends Object declared in class OttoQuindici

    Non date troppo peso alla linearità e correttezza formale del codice (sono alle prime armi) perchè mi accorgo che è scritto molto male, ma vi chiedo aiuto per risolvere e capire bene come funzionano questi beneditti generici.

    E' vero che non posso mandare in output di un metodo una variabile di tipo T, o meglio, che questo tipo di variabile non è implementabile in java? E in questo caso, devo sempre e comunque utilizzare degli array?

    Stavo pensando anche di usare la ricorsione, ma in questo caso sarebbe stato corretto creare due metodi variadici, cioè prima veniva chiamato il metodo binaria (par1, par2)
    e quest'ultimo chiamava in ricorsione binaria (par1,par2, inferiore,superiore...) ? QUesta soluzione l'ho provata ma il primo metodo non vedeva il secondo metodo binaria (mi sembra anche abbastanza normale). Come si può fare la ricorsione evitando all'utente di chiamare il metodo mettendo dei paramentri non necessari in chiamata?

    Confido nel vostro aiuto.

    Buona giornata.

    Roby492

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    quello più che altro mi sembra un errore dovuto a parentesi chiusa e if fuori da qualsiasi metodo...

    ma sei alle prime armi e vai sui generici?
    Trovo più logico fare una buona esperienza di base prima di aggiungere un argomento corposo come i generics
    RTFM Read That F*** Manual!!!

  3. #3
    Ciao Valia,
    Ecco il codice indentato un po meglio, non capisco perchè quando inserisco codice all'interno del tag code perda ogni formattazione. Speriamo bene per questo post:-)

    codice:
    import jbook.util.Input;
    import java.io.InputStreamReader;
    import java.io.BufferedReader ;
    import java.io.IOException;
    import static java.lang.Math.*;
    import static java.lang.Object.*;
    import java.util.ArrayList;
    import java.math.BigInteger;
    import java.io.*;
    import java.util.ArrayList;
    import  java.util.Arrays;
    import java.lang.reflect.Array;
    /*
    	CAP 8 es. 15
    	Si scriva una versione generica della ricerca binaria, sia in versione iterativa (6.6.5) che ricorsiva (8.6.2);
    	i due metodi dovranno funzionare su array dello stesso tipo dell'elemento cercato.
    	
    	
    */
    @SuppressWarnings({"unchecked"})
    public class OttoQuindici<T>
    {
    	public static void main(String []args)
    	{
    		//System.out.println("Sce");
    		String scelta=Input.readString("Scegli tra vettore String o numerico:(String/Int) ");
    		String[] box1= new String[]{"cane","dente","forbice","nome","otranto","ponte","zorro"};
    		int[] box2=new int[]{2,4,5,6,11,12,34,54};
    		if(scelta=="String")
    		{
    			for(int i =0;i<box1.length;i++)
    			{
    				System.out.print(box1[i]+"   ");
    			}
    			String[] c = new String[50];
    			String[] cerca = new String[50];
    			//T[] cerca= new Object[1];
    			cerca[0]="ponte";
    			OttoQuindici<String> OttoQuindici = new OttoQuindici<String>();
    			c =OttoQuindici.binaria(box1, cerca, String.class);
    		}
    		else
    		{
    			for(int i =0;i<box2.length;i++)
    			{
    				System.out.print(box2[i]+"   ");
    			}
    			
    		}
    	}
    	public T[] binaria(T[] elementi, T[] ricerca,Class<T> clazz)
    	{
    		T[] risultato = (T[]) Array.newInstance(clazz, 50);
    		int inferiore=0;
    		int superiore=0;
    		int meta=0;
    		int i =0;
    		int trovato=0;
    		//T[] ricerca=new Object[1];	
    		superiore=elementi.length;
    		do{
    			meta=(superiore+inferiore)/2;
    			if((superiore+inferiore)%2!=0)
    			{
    				meta=meta+1;
    			}
    		if(ricerca[0].compareTo(elementi[i])==0){
    			trovato=1;
    			risultato[0]=elementi[i];
    		}
    		if(ricerca[0].compareTo(elementi[i])<0&&trovato==0)
    		{
    			superiore=meta;
    		}else
    		{
    			inferiore=meta;
    		}
    		i=i+1;
    		}while(inferiore!=superiore||trovato!=1);
    		
    		return risultato;	
    	}
    		
    }
    Scusami, ma non ho capito a cosa ti riferisci per l'if al di fuori di un metodo...

    E comunque, in alto vedi anche il testo dell'esercizio, si vede che per loro i generics sono una cosa di base, anche se a me non sembra e mi pare ci voglia una conoscenza buona di Java prima di capirli affondo...

    Grazie

    Ciao

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Non trova il metodo compareTo, metodo che hanno solo le classi che implementano l' interfaccia Comparable.
    Per limitare il parametro alle sole classi che la implementano, la sintassi è:

    codice:
    <T implements Comparable>
    Altrimenti come T prendi anche tipi che non hanno il metodo compareTo.

  5. #5
    Bene, ora ho provato a aggiungere quella dicitura:

    codice:
    @SuppressWarnings({"unchecked"})
    public class OttoQuindici implements Comparable<T>
    {
    	public static void main(String []args)
    	{
    		String scelta=Input.readString("Scegli tra vettore String o numerico:(String/Int) ");
    		String[] box1= new String[]{"abaco","ancona","bingo","cozza","milano","musica","pollo"};
    		int[] box2=new int[]{2,4,5,6,11,12,34,54};
    		if(scelta=="String")
    		{
    			for(int i =0;i<box1.length;i++)
    			{
    				System.out.print(box1[i]+"   ");
    			}
    			String[] c = new String[50];
    			String[] cerca = new String[50];
    			//T[] cerca= new Object[1];
    			cerca[0]="musica";
    			OttoQuindici<String> OttoQuindici = new OttoQuindici<String>();
    			c =OttoQuindici.binaria(box1, cerca, String.class);
    		}
    		else
    		{
    			for(int i =0;i<box2.length;i++)
    			{
    				System.out.print(box2[i]+"   ");
    			}
    			
    		}
    	}
    	public T[] binaria(T[] elementi, T[] ricerca,Class<T> clazz) 
    	{
    		T[] risultato = (T[]) Array.newInstance(clazz, 50);
    		int inferiore=0;
    		int superiore=0;
    		int meta=0;
    		int i =0;
    		int trovato=0;
    		//T[] ricerca=new Object[1];	
    		superiore=elementi.length;
    		do{
    			meta=(superiore+inferiore)/2;
    			if((superiore+inferiore)%2!=0)
    			{
    				meta=meta+1;
    			}
    		if(ricerca[0].compareTo(elementi[i])==0){
    			trovato=1;
    			risultato[0]=elementi[i];
    		}
    		if(ricerca[0].compareTo(elementi[i])<0&&trovato==0)
    		{
    			superiore=meta;
    		}else
    		{
    			inferiore=meta;
    		}
    		i=i+1;
    		}while(inferiore!=superiore||trovato!=1);
    		
    		return risultato;	
    	}
    		
    }
    ma ora gli errori in compilazione sono 10 e non più due: sembra non trovare più T!!!

    codice:
    C:\Users\Roby492\Dropbox\java\CAP8>javac OttoQuindici.java
    OttoQuindici.java:22: error: cannot find symbol
    public class OttoQuindici implements Comparable<T>
                                                    ^
      symbol: class T
    OttoQuindici.java:52: error: cannot find symbol
            public T[] binaria(T[] elementi, T[] ricerca,Class<T> clazz)
                               ^
      symbol:   class T
      location: class OttoQuindici
    OttoQuindici.java:52: error: cannot find symbol
            public T[] binaria(T[] elementi, T[] ricerca,Class<T> clazz)
                                             ^
      symbol:   class T
      location: class OttoQuindici
    OttoQuindici.java:52: error: cannot find symbol
            public T[] binaria(T[] elementi, T[] ricerca,Class<T> clazz)
                                                               ^
      symbol:   class T
      location: class OttoQuindici
    OttoQuindici.java:52: error: cannot find symbol
            public T[] binaria(T[] elementi, T[] ricerca,Class<T> clazz)
                   ^
      symbol:   class T
      location: class OttoQuindici
    OttoQuindici.java:22: error: OttoQuindici is not abstract and does not override abstract method compareTo(T) in Comparab
    le
    public class OttoQuindici implements Comparable<T>
           ^
    OttoQuindici.java:40: error: type OttoQuindici does not take parameters
                            OttoQuindici<String> OttoQuindici = new OttoQuindici<String>();
                                        ^
    OttoQuindici.java:40: error: type OttoQuindici does not take parameters
                            OttoQuindici<String> OttoQuindici = new OttoQuindici<String>();
                                                                                ^
    OttoQuindici.java:54: error: cannot find symbol
                    T[] risultato = (T[]) Array.newInstance(clazz, 50);
                    ^
      symbol:   class T
      location: class OttoQuindici
    OttoQuindici.java:54: error: cannot find symbol
                    T[] risultato = (T[]) Array.newInstance(clazz, 50);
                                     ^
      symbol:   class T
      location: class OttoQuindici
    10 errors
    Non mi sono chiare molte cose, come potete capire. Io devo ridefinire il funzionamento del metodo compareTo se implementato sui generici? E se si, come fare nel mio caso?

    Grazie mille

  6. #6
    Infatti hai colto male il suggerimento datoti.
    Quello che devi fare e di specificare che T non un generico Object ma che deve almeno essere un comparable. Quindi non devi implementare tu Comparable ma lo deve fare T.
    Per dire a che il tuo T deve essere almeno un comparable devi definire la tua Classe generica in questo modo:
    codice:
    public class OttoQuindici<T extends Comparable<T>>
    Ciao

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.