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