C'è qualcosa come instanceOf (Class <?> C) in Java?


87

Voglio controllare se un oggetto oè un'istanza della classe Co di una sottoclasse di C.

Ad esempio, se pè di classe Pointvoglio x.instanceOf(Point.class)essere truee anche x.instanceOf(Object.class)essere true.

Voglio che funzioni anche per i tipi primitivi in ​​scatola. Ad esempio, if xis an Integerthen x.instanceOf(Integer.class)should be true.

C'è una cosa del genere? In caso contrario, come posso implementare un tale metodo?


gestire le lezioni in scatola è un po 'complicato
dfa

Risposte:


172

Class.isInstance fa quello che vuoi.

if (Point.class.isInstance(someObj)){
    ...
}

Ovviamente, non dovresti usarlo se puoi usarlo instanceofinvece, ma per gli scenari di riflessione spesso è utile.


6
@Ahamed è probabilmente più lento, ma quel che è peggio è che è più difficile da capire! Se c'è un modo molto semplice per fare qualcosa - come if (a instanceof Point)- ma lo fai in un modo più contorto, chiunque legga il codice è destinato a pensare "oh, ci deve essere una ragione per cui questo viene fatto nel modo più duro", e quindi passa alla documentazione per scoprire come Class.isInstancedifferisce da instanceof. Sprechi il tempo dei tuoi colleghi.
gustafc

21

Voglio controllare se un oggetto o è un'istanza della classe c o di una sottoclasse di c. Ad esempio, se p è di classe Point, voglio x.instanceOf (Point.class)

Ehm, cosa? Cosa sono o, pe x?

Voglio che funzioni anche per i tipi primitivi. Ad esempio, se x è un numero intero, x.instanceOf (Integer.class) e anche x.instanceOf (Object.class) dovrebbero essere true.

No. Non dovrebbe nemmeno compilarsi. Le primitive non sono oggetti e non puoi chiamare metodi su di esse.

Ad ogni modo, ci sono tre cose, una delle quali può sicuramente ottenere ciò che desideri (differiscono in qualche modo nel punto esatto in cui si applicano:

  • L' instanceofoperatore se conosci la classe in fase di compilazione.
  • Class.isInstance () se si desidera confrontare la classe di un oggetto con una classe non nota in fase di compilazione.
  • Class.isAssignableFrom () se si desidera controllare l'assegnabilità dati due oggetti classe.

9
x instanceof Integer
x instanceof Object

devi solo usare la sintassi giusta

per i tipi primitivi, devi farlo in modo completamente diverso. Poiché non è possibile creare metodi per loro, è necessaria una classe che mantenga il metodo. Quindi, invece di "x.instanceOf (Integer.Class)", devi chiamare "MyClassComparer.instanceOf (x, Integer.Class)" o qualcosa del genere. Questo potrebbe essere facilmente implementato sovraccaricando i metodi, ma non riesco a vedere un caso in cui quella funzionalità sarebbe affatto desiderabile.


4

Infatti in Java esiste un operatore booleano chiamato instanceof che può essere utilizzato per determinare se un oggetto è un'istanza di una classe, un'istanza di una sottoclasse o un'istanza di una classe che implementa una particolare interfaccia.

if(obj instanceof SomeClass) {
    // Do something
}

Il Java Tutorial ha un buon esempio di questo operatore


1
non è possibile utilizzare instanceof con tipi primitivi
dfa

4
Confondeva i tipi primitivi con gli oggetti. Si prega di leggere ... "Ad esempio, se x è un numero intero, x.instanceOf (Integer.class) e anche x.instanceOf (Object.class) dovrebbero essere true." Peccato che tu abbia votato per difetto tutte le risposte
Victor Hugo il

Seguendo (sp) il suggerimento di utilizzare il tutorial Java. È un buon riferimento per l'apprendimento della lingua stessa.
luis.espinal

0

Tu puoi fare:

if (foo instanceof classNameYouWantToCheck) 

non è possibile utilizzare instanceof con tipi primitivi
dfa

La classe era solo per mostrare che avrebbe dovuto scrivere il nome della classe lì. Lo aggiusterò
fmsf

0

"Voglio che funzioni anche per i tipi primitivi. Ad esempio, se x è un numero intero, x.instanceOf (Integer.class) e anche x.instanceOf (Object.class) dovrebbero essere true."

Perché? I tipi primitivi e i tipi di riferimento sono completamente separati. Un int primitivo non è un sottotipo di Integer né Object. Il tipo di un valore primitivo è sempre noto staticamente in fase di compilazione, quindi non ha senso testarne il tipo. Certo, puoi inscatolare un valore primitivo e quindi testarne il tipo:

(Integer)5 instanceof Integer

Ma quale sarebbe il punto?


-2

Penso che tu sia confuso su instanceof per oggetti grezzi e generici

obj instanceof Class
obj instanceof Class<?> // this is the one you want

2
Non è possibile utilizzare i generici sul lato destro dell'operatore instanceof a causa della cancellazione del tipo.
Matthias

2
No, sei tu che ne sei confuso. Devi usare il tipo grezzo dopo instanceof.
Dawood ibn Kareem
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.