In Java, posso usare una variabile di tipo letterale o di tipo primitivo in un’espressione di espressione?

Posso usare un tipo primitivo letterale o una variabile di tipo in un’espressione di espressione?

 class MyClass { { boolean b1 = null instanceof T; // T erasure -> Object should be used boolean b2 = 2 instanceof Integer; // Incompatible operands } 

Sto ricevendo errori di compilazione. Esiste un modo per eludere questi errori e utilizzare una variabile di tipo letterale / di tipo primitivo in un’espressione di espressione?

In sostanza, voglio essere rassicurato che no, non potrò mai farlo.

No, a causa della cancellazione del tipo . Un’istanza di MyClass realtà non sa cosa sia T

Devi avere un’istanza di Class . Quindi puoi usare il metodo isInstance . Un modo per farlo è specificarlo nel costruttore:

 class MyClass { private Class clazz; MyClass(Class clazz) { this.clazz = clazz; } // Now you can use clazz to check for instances, create new instances ect. } 

Per il secondo, il problema è il primo operando, non il secondo. Il valore primitivo stesso non è un’istanza di Integer ; la versione in scatola è:

 Object obj = 2; boolean b2 = obj instanceof Integer; 

Ogni volta che hai un vero valore primitivo, conoscerai già il tipo, quindi fare un controllo dinamico dei tipi non ha molto senso.

  1. A causa della cancellazione del tipo, non puoi sapere cosa sia T

  2. I letterali (ad eccezione dei letterali stringa) non sono oggetti.
    Pertanto, no.

Fondamentalmente, l’istanza di askes per un object come operando a sinistra. Le variabili primitive non sono oggetti, quindi no, non puoi usarlo in questo modo.

  1. Non puoi farlo.
  2. Anche se tu potessi, non puoi usarlo.

Un tipico utilizzo di instanceof sembra

 void somemethod(Collection c) { if (c instanceof List) {...} } somemethod(new ArrayList()); 

La cosa importante qui è che si ottiene un object di un supertipo (qui: Raccolta) che può o non può essere l’istanza di un sottotipo (qui: Elenco). Con i primitivi questo è imansible:

 void anothermethod(double x) { .... // <------ X } anothermethod(42); 

Nel punto X c'è una variabile x di tipo double, non ci sono informazioni nascoste su alcuni int 42. Il parametro attuale 42 non è stato masquerade come double, ma è convertito in double. Ecco perché l'instanceof non ha senso per i primitivi.