Provavelmente isso já foi feito antes, mas uma pesquisa rápida trouxe apenas a mesma pergunta para C #. Veja aqui.
O que basicamente quero fazer é verificar se um determinado objeto implementa uma determinada interface.
Eu meio que descobri uma solução, mas isso não é confortável o suficiente para usá-la frequentemente em declarações if ou case e eu estava imaginando se o Java não tem solução embutida.
public static Boolean implementsInterface(Object object, Class interf){
for (Class c : object.getClass().getInterfaces()) {
if (c.equals(interf)) {
return true;
}
}
return false;
}
EDIT: Ok, obrigado por suas respostas. Especialmente para Damien Pollet e Noldorin, você me fez repensar meu design para não testar mais interfaces.
Respostas:
O
instanceof
operador faz o trabalho deNullPointerException
maneira segura. Por exemplo:produz verdadeiro. Desde a:
produz false, o
instanceof
operador é nulo seguro (o código que você postou não é).instanceof é a alternativa segura e compilada em tempo de compilação para a classe # isInstance (Object)
fonte
MyClass.class
ouMyInterface.class
no seu código-fonte. Literais de classe podem se referir a classes, interfaces e tipos primitivos e retornarão uma instância correspondente à classe Class. Meu argumento é que o OP não está usando um literal de classe, mas uma instância da classe Class e, infelizmente, o operador do lado direito dainstanceof
palavra - chave deve ser um literal de classe, não uma instância da classe Class.Isso deve fazer:
Por exemplo,
avalia como
true
.fonte
Eu prefiro
instanceof
:que é muito mais comum e legível do que
SomeType.isInstance(obj)
fonte
if (obj instanceof SomeType) { ... }
é estático (isto é - não pode mudar em tempo de execução) eSomeType.isInstance(obj)
é dinâmico.Essa foi fácil :
fonte
Se você deseja testar as interfaces:
}
clazz é uma interface e myType é um tipo que você definiu que pode implementar várias interfaces. Com esse código, você obtém apenas os tipos que implementam uma interface definida
fonte
Eu tive esse problema hoje à noite com o Android e, depois de analisar as soluções javadoc, criei essa solução de trabalho real apenas para pessoas como eu que precisam de um pouco mais do que uma explicação sobre o javadoc.
Aqui está um exemplo de trabalho com uma interface real usando java android. Ele verifica a atividade chamada implementada na interface AboutDialogListener antes de tentar converter o campo AboutDialogListener.
... Mais tarde, verifico se o campo adl é! Null antes de chamar a interface
fonte
Com o Apache commons-lang ArrayUtils, verifique se a interface necessária está contida nas interfaces do seu objeto
fonte