Newsgroup: it.comp.java
Titolo: Probelma con i metodi di Integer

Ciao, ho alcuni problemi con la classe Integer.
All'inizio del programma importo la classe:
import java.lang.Integer;
Poi eseguo questa istruzione:
Integer a = new Integer(3);
E il compilatore mi da questo errore:
"unexpected type found: type parameter Integer
required: class"
Perchè non funziona quest'assegnazione?
Nella documentazione, riguardo al costruttore ho trovato questo:
Integer(int value)
          Constructs a newly allocated Integer object that represents the specified
int value.
Per quanto ne so io dovrebbe funzionare...
Ad ogni modo RIESCO a passare oggetti di tipo Integer (precedentemente
creati) come parametri espliciti all'interno dei metodi da me sviluppati, ma
NON RIESCO ad utilizzare i metodi dell'oggetto Integer, per esempio
l'intValue() e il compareTo(), poichè mi da il seguente errore:
"cannot find symbol: method intValue()
location: class java.lang.Object"
Mi sapete dire qualcosa? Ho provato a reinstallare il jdk (1.5) completo, ma
non è cambiato nulla. Help me please!
Ringrazio fin d'ora chi mi aiuterà!
Ciao!
PiPPo
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Integer a = new Integer(3);
non basta. In Java ogni "programma" deve essere contenuto in una classe:
import java.lang.Integer;
class Test {
Integer a = new Integer(3);
}
nel tuo caso vede Integer prima di incontrare class e cosi te lo chiede.
claudio
-- 
Claudio Nieder, Kanalweg 1, CH-8610 Uster, Tel 
+41 79 357 6743
yahoo messenger: claudionieder aim: claudionieder icq:42315212
mailto:
pri...@claudio.ch
 
http://www.claudio.ch

 non basta. In Java ogni "programma" deve essere contenuto in una classe
Non l'ho scritto, ma lo davo per scontato!
L'import è ovviamente prima della definizione della classe. All'interno
della classe stessa, nel main riesco a creare dinamicamente degli Integer da
passare come paremetri espliciti ad un metodo che ho costruito all'interno
della classe stessa, ad esempio:
crea(a,b,....,new Integer(3));
E il metodo crea non mi da nessun problema.
Il metodo search(int a, String b,...,Integer n) non mi funziona poichè il
compilatore non riesce a trovare nessun metodo dell'oggetto Integer, nemmeno
il costruttore!!! Come detto prima, già scrivendo Integer uno = new
Integer(1); mi diche che non trova il costruttore! Com'è possibile????
Se fosse necessario posso allegare il codice di tutta la classe, è una
paginetta...
Ciao e grazie!


Scusate l'errore di ortografia, me ne sono accorto solo ora di aver scritto
"Probelma" anzichè "Problema" nel titolo del post!
PiPPo


 L'import è ovviamente prima della definizione della classe. All'interno
Allora mostraci la classe come è almeno fino al punto dove c'è l'errore
e mostraci *esattamente* gli errori che ricevi da javac. 
Per esempio
$ cat X.java; echo "Compile it:"; javac X.java; echo "Run it:"; java X
class X {
 Integer uno=new Integer(1);
 X() { System.out.println("uno="+uno); }
 public static void main(String[] a) { new X(); }
}
Compile it:
Run it:
uno=1
e pure
$ cat Y.java; echo "Compile it:"; javac Y.java; echo "Run it:"; java Y
class Y {
 static Integer uno=new Integer(1);
 public static void main(String[] a) { System.out.println("uno="+uno); }
}
Compile it:
Run it:
uno=1
funzionano benissimo. Il tuo error lo ricevo solo nel caso che manca la
classe:
$ cat Z.java; echo "Compile it:"; javac Z.java
 Integer uno=new Integer(1);
Compile it:
Z.java:1: 'class' or 'interface' expected
 Integer uno=new Integer(1);
 ^
1 error
Perciò senza sapere che cosa fai nella tua classe e cosa dice javac è un
po difficile aiutarti.


Ciao! Scusa se non quoto ma ho paura che il messaggio diventi troppo
pesante. Ho testato la tua classe e il compilatore non da nessun errore,
nemmeno utilizzando il metodo intValue().
Ecco la classe che mi da l'errore:
import java.util.*;
import java.lang.Integer;
class TestLinkedBinaryTree {
  public static void main( String argv[] ) throws Exception {
     BinaryTree<Integer> T = new LinkedBinaryTree<Integer>();
     Position<Integer> p0,p1,p2,p3,p4,p5,p6,p7,p8,p9;
     p1 = T.root();
     T.expandExternal(p1,null,null);
     T.replace(p1,new Integer(1));
     p2 = T.left(p1);
     T.expandExternal(p2,null,null);
     T.replace(p2,new Integer(2));
     p3 = T.right(p2);
     T.expandExternal(p3,null,null);
     T.replace(p3,new Integer(3));
     p4 = T.right(p1);
     T.expandExternal(p4,null,null);
     T.replace(p4,new Integer(4));
     p5 = T.right(p4);
     T.expandExternal(p5,null,null);
     T.replace(p5,new Integer(5));
     p6 = T.right(p5);
     T.expandExternal(p6,null,null);
     T.replace(p6,new Integer(6));
     p7 = T.left(p5);
     T.expandExternal(p7,null,null);
     T.replace(p7,new Integer(7));
     p8 = T.left(p3);
     T.expandExternal(p8,null,null);
     T.replace(p8,new Integer(8));
     p9 = T.right(p8);
     T.expandExternal(p9,null,null);
     T.replace(p9,new Integer(9));
     p0 = T.left(p2);
     T.expandExternal(p0,null,null);
     T.replace(p0,new Integer(0));
     //INSERIRE QUI IL CODICE RICHIESTO
     System.out.println("search: "+search(T,p3,new Integer(3)));
     System.out.println(" ");
  } //main
 
     public static <Integer> Position<Integer> search (BinaryTree<Integer> T,
Position<Integer> p, Integer n)
	 {
		if (n==p.element())
 		 { System.out.println("Yes!"); return p; }
	 	else
	 	{
		 Position<Integer> tmp=null;
		 if (T.hasLeft(p) && T.left(p)!=null) tmp=search(T,T.left(p),n);
		 if (tmp==null && T.hasRight(p) && T.right(p)!=null)
tmp=search(T,T.right(p),n);
		 return tmp;
		}
	 }
} //class
E' una esercitazione sugli alberi binari. Ho già implementato altri metodi e
funzionano tutti correttamente, nonostante usino gli Integer. Non guardare
la correttezza dell'algoritmo (poichè non sono riuscito a testarlo!), ma la
sintassi. All'inizio ho importato la classe java.lang.Integer. Questa classe
è una classe di prova che si appoggia ad altre classi implementate. E'
richiesto di implementarne alcuni metodi al suo interno (al solo scopo di
consegnare un unico file al professore!). Se compilo la classe così com'è
scritta non da alcun errore, ma il confronto non lo esegue!!! Già questa
condizione if (n==p.element()) non è verificata! Eppure p3.element() ritorna
3 e n (passato come parametro esplicito nella chiamata alla funzione search)
è proprio 3.
Ho pensato che fosse un problema di overloading dell'operatore ==, quindi ho
riscritto così il metodo search:
public static <Integer> Position<Integer> search (BinaryTree<Integer> T,
Position<Integer> p, Integer n)
	 {
			int newN = n.intValue();
			int newP = (p.element()).intValue();
			if (newN == newP) { System.out.println("Yes!"); return p; }
	 	else
	 	{
		 Position<Integer> tmp=null;
		 if (T.hasLeft(p) && T.left(p)!=null) tmp=search(T,T.left(p),n);
		 if (tmp==null && T.hasRight(p) && T.right(p)!=null)
tmp=search(T,T.right(p),n);
		 //System.out.println("tmp =" + tmp);
		 return tmp;
		}
	 }
E su questo il compilatore si incazza e non riesco a capire il perchè!!!
L'output è il seguente:
cannot find symbol
symbol: method intValue()
location: class java.lang.Object
int newN = n.intValue();
        ^
cannot find symbol
symbol: method intValue()
location: class java.lang.Object
int newP = (p.element()).intValue();
        ^
2 errors.
!@#^&, non riesco a venirne fuori!!!
Se scrivo, all'interno del metodo search: Integer uno = new Integer(1); il
compilatore si incazza ancora dicendo, oltre agli errori precedenti:
unexpected type
found: type parameter Integer
required: class
Integer uno = new Integer(1);
         ^
Se però scrivo static Integer uno = new Integer(1); il compilatore mi da
solo questo errore:
illegal start of expression
static Integer uno = new Integer(1);
^
Non so più dove sbattere la testa, ti prego, aiutami!
Se vuoi puoi trovare un file zip con la classe vergine e le altre classi a
cui si appoggia (già implementate) all'indirizzo:
http://www.dei.unipd.it/corsi/fi2ae/laboratorio/labJava1_06.zip
Grazie e scusa il disturbo!
PiPPo
P.S.: so che ho un modo di indentare strano, non volermene!


 public static <Integer> Position<Integer> search (BinaryTree<Integer> T,
perchè anche quell' <Integer> dopo static?
-- 
stajune

 Position<Integer> p, Integer n)
Qui mi metti in imbarazzo. Io so cosa voglia dire:
public static Position<Integer> search(...)
ma non ho idea che cosa sia
public static <Integer> Position<Integer> search(...)
Però ha da fare con quel Problema che osservi:
$ cat X.java; echo "Compile it:"; javac X.java; echo "done"
import java.util.List;
class X {
 public static List<Integer> searchTest (Integer n)
 {
  int newN = n.intValue();
  return null;
 }
}
Compile it:
done
$ cat Y.java; echo "Compile it:"; javac Y.java; echo "done"
import java.util.List;
class Y {
 public static <Integer> List<Integer> test(Integer n)
 {
  int newN = n.intValue();
  return null;
 }
}
Compile it:
Y.java:5: cannot find symbol
symbol  : method intValue()
location: class java.lang.Object
  int newN = n.intValue();
              ^
1 error
done
$ cat Z.java; echo "Compile it:"; javac Z.java; echo "done"
import java.util.List;
class Z {
 public static <Integer> List<Integer> test(Integer n)
 {
  return null;
 }
}
Compile it:
done
Quella <Integer> extra che a me non dice niente, sembra essere valido,
javac non da alcun errore, però poi da un'errore quando usi Integer.
...ricerca sul Web...
Trovato: con quel <Integer> dichiari che il metodo e un metodo generico.
vedi 
http://java.sun.com/docs/books/tutorial/extra/generics/methods.html
Esempio: public R test(T t); e un metodo non-generico, cioé in quel caso
T statt proprio per la classe T (o derivazioni di T).
public <T> R test(T t); e un metodo generico. Qui T non si riferisce più
ad una classe T, man diventa un "placeholder".
Questo vuol dire che puoi definire una unica funzione search
public static <X> Position<X> search (BinaryTree<X> T,
Position<X> p, X n)
che puo essere usata con diverse classi al posto di X:
BinaryTree<Integer> bti;
Position<Integer> pi;
BinaryTree<String> bts;
Position<String> ps;
...
pi=search(bti,pi,new Integer(3));
ps=search(bts,ps,"tre");
Pero scrivendo la funzione search non puoi usare nessuna charateristica
specifica di una classe come Integer o String, come n.intVal() perche
essendo generica non sai a cosa sara sostituita la X.
Invece se vuoi scrivere una funzione search per Integer (e derivati) usi:
public static Position<Integer> search (BinaryTree<Integer> T,
Position<Integer> p, Integer n)
In questo caso Integer si riferisce proprio alla classe Integer.
Tu usando la nozione
public static <Integer> Position<Integer> search (BinaryTree<Integer> T,
Position<Integer> p, Integer n)
hai dichiarato search come metodo generico e Integer e "degradato" allo
stesso ruolo come la X nel mio esempio. Cioé la parola Integer non si
riferisce più alla classe Integer, ma e semplicemente una "X". Per questa
ragione n.intVal() non funziona.
claudio (che ha imparato qualcosa di nuovo su Java)


 public static <Integer> Position<Integer> search(...)
Questa, se non sbaglio, e' una nuova caratteristica di Java 1.5. Permette
proprio di dichiarare i tipi generici (almeno cosi' mi han spiegato
all'universita'). A me e' stato detto che non mettendo quell'<Integer>
iniziale il compilatore non interpreta correttamente i parametri parametrici
(scusate il gioco di parole!).
Infatti la firma del metodo che mi e' stata data da implementare e' questa:
public static <E> Position<E> search( BinaryTree<E> T, Position<E> p,
Integer n )
Quindi, essendo l'albero binario formato da elementi di tipo Integer, ho
"ben" pensato di sostituire il parametro <E> proprio con il tipo Integer. Al
momento non ho la possibilita' di apportare le modifiche poiche' non ho i
sorgenti sottomano. Provero' tra qualche ora e vi faro' sapere! Intanto vi
ringrazio per l'aiuto e la disponibilita'!
PiPPo


Eccomi: ho provato e sono riuscito a farlo funzionare! Come suggerito da
stajune ho usato il metodo equals e tutto è funzionato alla perfezione. Poi,
al posto di <Integer> ho sostituito il tipo parametrico generico <E> e
funziona ancora, ovviamente, poichè il compilatore riconosce il tipo da
utilizzare appunto dai parametri che via via vengono passati al metodo.
L'errore mio era stato quello di sostituire <E> con <Integer>, poichè sapevo
a priori che era un albero binario di tipo Integer. E giustamente
all'interno del metodo non potevano essere chiamati metodi riferiti ad
Integer, dato che è un parametro. Disattenzione mia dovuta al fatto che non
sto sviluppando una classe generica ma specifica per alberi binari di
Integer, tutto qui.
Grazie ancora a stajune e Claudio per avermi aiutato e, soprattutto, per la
pazienza! ;-)
Ciao!
