Existe algo como instanceOf (Class <?> C) em Java?

87

Quero verificar se um objeto oé uma instância da classe Cou de uma subclasse de C.

Por exemplo, se pé de classe Pointquero x.instanceOf(Point.class)ser truee também x.instanceOf(Object.class)ser true.

Quero que funcione também para tipos primitivos encaixotados. Por exemplo, se xé um, Integerentão x.instanceOf(Integer.class)deveria ser true.

Existe uma coisa dessas? Se não, como posso implementar esse método?

serpenteante
fonte
lidar com aulas em caixas é um pouco bagunçado
dfa

Respostas:

172

Class.isInstance faz o que você deseja.

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

Claro, você não deveria usá-lo se pudesse instanceof, mas para cenários de reflexão, ele geralmente é útil.

gustafc
fonte
6
@Avergonha, provavelmente é mais lento, mas o pior é que é mais difícil de entender! Se existe uma maneira muito simples de fazer algo - como if (a instanceof Point)- mas você faz de uma forma mais complicada, quem lê o código está fadado a pensar "ah, deve haver uma razão para que isso seja feito da maneira mais difícil", e em seguida, vá para a documentação para descobrir como Class.isInstanceé diferente de instanceof. Você desperdiça o tempo dos seus colegas.
gustafc
21

Quero verificar se um objeto o é uma instância da classe c ou de uma subclasse de c. Por exemplo, se p for da classe Point, quero x.instanceOf (Point.class)

Hum ... O quê? O que são o, pe x?

Eu quero que funcione também para tipos primitivos. Por exemplo, se x for um inteiro, então x.instanceOf (Integer.class) e também x.instanceOf (Object.class) devem ser verdadeiros.

Não. Ele nem deveria compilar. Primitivos não são objetos e você não pode chamar métodos neles.

De qualquer forma, existem três coisas, uma das quais pode definitivamente alcançar o que você deseja (eles diferem um pouco em onde exatamente se aplicam:

  • O instanceofoperador se você conhece a classe em tempo de compilação.
  • Class.isInstance () se você deseja verificar a classe de um objeto em relação a uma classe não conhecida em tempo de compilação.
  • Class.isAssignableFrom () se você quiser verificar a capacidade de atribuição de dois objetos de classe.
Michael Borgwardt
fonte
9
x instanceof Integer
x instanceof Object

você apenas tem que usar a sintaxe certa

para tipos primitivos, você deve fazer isso de maneira completamente diferente. Visto que você não pode criar métodos para eles, você precisa de uma classe que mantenha o método. Portanto, em vez de "x.instanceOf (Integer.Class)", você deve chamar "MyClassComparer.instanceOf (x, Integer.Class)" ou algo parecido. Isso poderia ser facilmente implementado por métodos de sobrecarga, mas não consigo ver um caso em que essa funcionalidade seja desejável.

Erich Kitzmueller
fonte
4

Na verdade, em Java há um operador booleano chamado instanceof, que pode ser usado para determinar se um objeto é uma instância de uma classe, uma instância de uma subclasse ou uma instância de uma classe que implementa uma interface específica.

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

O Tutorial Java tem um bom exemplo desse operador

Victor Hugo
fonte
1
você não pode usar instanceof com tipos primitivos
dfa
4
Ele confundiu tipos primitivos com objetos. Leia ... "Por exemplo, se x for um inteiro, então x.instanceOf (Integer.class) e também x.instanceOf (Object.class) devem ser verdadeiros." Que vergonha se você votou contra todas as respostas
victor hugo
Apoiando (sp) a sugestão de usar o Tutorial Java. É uma boa referência para aprender o idioma em si.
luis.espinal,
0

Você pode fazer:

if (foo instanceof classNameYouWantToCheck) 
fmsf
fonte
você não pode usar instanceof com tipos primitivos
dfa
A classe era apenas para mostrar que ele deveria escrever o nome da classe ali. Vou consertar
fmsf
0

"Eu quero que funcione também para tipos primitivos. Por exemplo, se x for um inteiro, então x.instanceOf (Integer.class) e também x.instanceOf (Object.class) deve ser verdadeiro."

Por quê? Tipos primitivos e tipos de referência são completamente separados. Um int primitivo não é um subtipo de Integer nem Object. O tipo de um valor primitivo é sempre conhecido estaticamente em tempo de compilação, portanto, não há motivo para testar seu tipo. Claro, você pode encaixotar um valor primitivo e testar seu tipo:

(Integer)5 instanceof Integer

Mas qual seria o ponto?

newacct
fonte
-2

Acho que você está confuso sobre a instância de objetos brutos e genéricos

obj instanceof Class
obj instanceof Class<?> // this is the one you want
Paul Bors
fonte
2
Você não pode usar genéricos no lado direito do operador instanceof devido ao apagamento de tipo.
Matthias
2
Não, é você quem está confuso sobre isso. Você tem que usar o tipo bruto depois instanceof.
Dawood ibn Kareem