Como substituir o instanceof

Oi,

apenas quero por este exemplo para mostrar como fazer uma espécie de instanceof, mas aonde os valores a serem comparados entram como parâmetros.

Eu tentei em primeiro lugar com o instanceof, mas tenho erros de compilação. Esta é a solução conseguida por mim.

Quem tiver mais sugestões, ponha aqui.

public class Instantiation 
{
	public void checkInstantiation(Class clazz, Object toCheck)
	{
		try
		{
			System.out.println("1 --> " + Male.class.getCanonicalName());
			System.out.println("2 --> " + clazz.toString());
//			System.out.println("3 --> " + clazz.getCanonicalName());
			System.out.println("4 --> " + Class.forName(Male.class.getCanonicalName()));
//			System.out.println("5 --> " + clazz.getCanonicalName());
			
			if(Class.forName(clazz.getCanonicalName()).isInstance(toCheck))
			{
				System.out.println(clazz.toString() + " is instance of " + Male.class.toString());
			} else
			{
				System.out.println("Not found");
			}
			

		}
		catch (ClassNotFoundException e) 
		{
			e.printStackTrace();
		}
		catch (RuntimeException e) 
		{
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		Male male = new Male();
		Instantiation inst = new Instantiation();
		inst.checkInstantiation(male.getClass(), new Male());
	}
}

Obrigado,
Pedro

Que erro você teve com o instanceof? Normalmente ele é o ideal a ser usado mesmo…

Mas, só pelo desafio teorico, você pode fazer:

public boolean checkInstantiation(Class clazz, Object toCheck) { return clazz.isInstance(toCheck); }

Ou ainda:

public boolean checkInstantiation(Class clazz, Object toCheck) { return clazz.isAssignableFrom(toCheck.getClass()); }

Oi ViniGodoy,

Para o código:

if(clazz instanceof toCheck)
{
  System.out.println("YUPPPPIII");
}

O erro que tive foi:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	toCheck cannot be resolved to a type

	at Instantiation.checkInstantiation(Instantiation.java:14)
	at Instantiation.main(Instantiation.java:43)

Você só pode usar o instanceof com o nome da classe mesmo. E a classe é o segundo argumento do operador, não o primeiro. Por isso ele está dizendo que toCheck não é um tipo.

Male male = new Male(); if (male instanceof Male) System.out.println("yupiiiiii!!!");

Se você realmente precisa usar um objeto do tipo Class, você pode usar um dos métodos que eu descrevi acima. :wink: