PDA

View Full Version : [java] source level error


Miky Mouse
01-12-2007, 10:25
sto cercando di fare una classe parametrizzata rispetto a un tipo, quinci class classe<tipo>{...}
ma quando provo a compilare ottengo questo errore:

Syntax error, type parameters are only available if source level is 5.0


compilo da linea di comando su linux, niente ide e cose varie. l'output di java -version è questo:

java version "1.6.0"
Java(TM) SE Runtime Environment (build 1.6.0-b105)
Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)

e ho appena ricompilato e installato jre.... dove sbaglio??

lovaz
01-12-2007, 10:32
e javac -version?

Miky Mouse
01-12-2007, 10:40
e javac -version?

Eclipse Java Compiler v_686_R32x, 3.2.2 release, Copyright IBM Corp 2000, 2006. All rights reserved.


c'entra qualcosa con il fatto che avevo messo eclipse? cioè cerca di usare il compilatore di eclipse?

lovaz
01-12-2007, 10:50
Sì, usa quello.
O installi un jdk della sun o imposti
-source 1.5
(credo)

Miky Mouse
01-12-2007, 13:31
Sì, usa quello.
O installi un jdk della sun o imposti
-source 1.5
(credo)

ho provato a mettere j2sdk1.4 ma adesso se provo a compilare mi da un errore come se non sapesse neanche che si può mettere <tipo> dopo il nome della class, dice che deve esserci {

e se provo a fare javac -version mi dice

javac: invalid flag: -version
Usage: javac <options> <source files>

dove sbaglio?

lovaz
01-12-2007, 16:10
Infatti i tipi parametrici ci sono dalla versione 5,
prova con il compilatore di eclipse con opzione
-source 1.5

Miky Mouse
01-12-2007, 16:31
Infatti i tipi parametrici ci sono dalla versione 5,
prova con il compilatore di eclipse con opzione
-source 1.5

si infatti avevo già visto, funziona così ;)
non c'è un modo per impostarlo di default senza doverlo rimettere a ogni compilazione?

per il resto... mi da un sacco di warning quando cerco di usare cast da object a TIPO (dove tipo è parametrizzato)

roba del tipo:

Type safety: The cast from Object to TIPO is actually checking against the erased type Object

oppure

Type safety: The method nome_funzione(Object) belongs to the raw type Classe. References to generic type Classe<TIPO> should be parameterized

ovviamente i cast ecc sono tutti safe perche so quello che fanno, ma non c'è un modo per tranquillizzare il compilatore e evitarmi 12 warning di questo tipo a ogni compilazione?

banryu79
02-12-2007, 12:58
ovviamente i cast ecc sono tutti safe perche so quello che fanno, ma non c'è un modo per tranquillizzare il compilatore e evitarmi 12 warning di questo tipo a ogni compilazione?


Basta che fai esattamente quello che il warning ti consiglia: cambia il riferimento generico a Object nei metodi che prendono come parametro di ingresso un oggetto Class<TIPO> in un riferimento esplicito a Classe<TIPO>.

nome_funzione(Object) -> nome_funzione(Classe<TIPO>) e dentro non devi neanche più castare.

Miky Mouse
02-12-2007, 17:20
Basta che fai esattamente quello che il warning ti consiglia: cambia il riferimento generico a Object nei metodi che prendono come parametro di ingresso un oggetto Class<TIPO> in un riferimento esplicito a Classe<TIPO>.

nome_funzione(Object) -> nome_funzione(Classe<TIPO>) e dentro non devi neanche più castare.

mmh.. no forse non mi sono spiegato.

vi metto qualche frammento di codice che stò usando...

questa funzione:

public void insert(T x){
if(!els.contains(x)) els.addElement(x);}

dove els è un vector di T e T è il parametrizzato, la insert se non è presente l'elemento lo aggiunge alla fine.

nel main dichiaro un nuovo contenitore di oggetti:
GSet naturali = new GSet<Integer>();

quindi ora T dovrebbe essere un Integer...

poi chiamo la funzione così:
naturali.insert(new Integer(123));


cos'è che non ho capito?

banryu79
03-12-2007, 09:37
cos'è che non ho capito?


Lascia... non avevo capito bene io! :)

Guarda io uso NetBeans e non Eclipse, e quel warning è prodotto dal compilatore di Eclipse...

Ho trovato questo che spiega il significato del messaggio:
--> Type Safety: erased type (http://mindprod.com/jgloss/compileerrormessages.html#TYPESAFETYERASED)

lovaz
03-12-2007, 11:19
GSet naturali = new GSet<Integer>();
prova a dichiarare GSet<Integer> naturali...
naturali.insert(new Integer(123));
puoi passare direttamente 123, da java 5 c'è l'autoboxing