Originariamente inviato da Iwk_Batterio
E non funziona nemmeno
codice:
K pippo;
if pippo istanceof Comparable
Perché il compilatore mi dice che pippo potrebbe non essere istanziata(giustamente).
Ma questo è un altro discorso (e non centra con instanceof)! Si tratta del fatto che una variabile locale va inizializzata prima di essere usata.
Originariamente inviato da Iwk_Batterio
Aggiungo che non è il mio caso quello di aggiungere una verifica al momento della dichiarazione della classe, del tipo:
codice:
public class NaturalComparator<K extends Comparable>
Fino ad adesso hai parlato di K come di "una classe" ma qui K l'hai usato come "type variable". Non è la stessa cosa.
Se hai una classe puoi usare i metodi di java.lang.Class (isAssignableFrom() in modo specifico) per sapere se implementa Comparable. Se hai solo una type variable, non c'è altro modo che usare instanceof.
Vuoi che sia più esplicito??
Esempio: vogliamo sapere se la classe java.util.Date implementa Comparable (sì ... lo sappiamo dal javadoc che la implementa ma vogliamo verificarlo
).
codice:
if (Comparable.class.isAssignableFrom(Date.class)) { .... }
Se quel tuo K è una classe, allora avrai K.class invece di Date.class
Se invece K è una type variable, allora usi instanceof
codice:
import java.util.*;
public class Prova {
public static void main(String[] args) {
GenClass<Date> gc = new GenClass<Date>(new Date());
gc.test();
}
}
class GenClass<K> {
private K obj;
public GenClass(K obj) {
this.obj = obj;
}
public void test() {
if (obj instanceof Comparable) {
System.out.println("Questa istanza di GenClass ha un oggetto K che implementa Comparable");
}
}
}
E non si può fare altrimenti. Perché in questo caso K non è una classe!!