ne pouvez pas jeter à la mise en œuvre de l'interface
je suis très confus...
J'ai une classe qui implémente directement une interface:
public class Device implements AutocompleteResult
{...}
Ici est la preuve que je suis à la recherche sur le droit des variables:
Object match = ...;
log.debug(match.getClass()); //Outputs 'Device'
log.debug(match.getClass().getInterfaces()[0]); //Outputs 'AutocompleteResult'
Mais lorsque j'ai essayez de lancer une instance de la classe à l'interface:
AutocompleteResult result = (AutocompleteResult) match;
- Je obtenir une ClassCastException!
ClassCastException: Device cannot be cast to AutocompleteResult
Aussi, isAssignableFrom
renvoie la valeur false et je ne sais pas pourquoi:
log.debug(AutocompleteResult.class.isAssignableFrom(Device.class));
de la doc:
Détermine si le classe ou interface représenté par cette Classe d'objet est soit la même ou une super-classe ou superinterface de, la classe ou l'interface représentée par la Classe spécifiée en paramètre.
Ne devrais-je pas toujours être en mesure de lancer un objet à une interface de sa classe implémente?
Grâce.
- Oui, vous devriez! (et vous ne devriez même pas besoin de cast explicite.) Veuillez poster quelques autonome exemple de code qui illustre le problème.
Vous devez vous connecter pour publier un commentaire.
Cela peut se produire si deux chargeurs de classes de charge d'une classe nommée
AutocompleteResult
.Ces deux classes sont ensuite traités comme entièrement différentes les classes, même si elles ont le même package et le nom (et même de mise en œuvre/champs/méthodes).
Une cause commune pour cela est si vous utilisez une sorte de système de plugin et vos deux classes de base et les classes de plugin fournir la même classe.
Pour vérifier ce problème d'impression de la valeur retournée par
de la Classe.getClassLoader()
fautif sur les deux classes (la classe de l'interface implémentée parDevice
et le résultat deAutocompleteResult.class
).log.debug(match.getClass().getInterfaces()[0].getClassLoader()); log.debug(AutocompleteResult.class.getClassLoader())
Class[] interfaces = match.getClass().getInterfaces(); for(int i = 0; i < interfaces.length; i++){ Log.d(DEBUG_TAG, interfaces[i].toString()); Log.d(DEBUG_TAG, AutocompleteResult.class.toString()); }
AKA lorsque Java, apparemment, n'a pas Java.
J'ai frappé ce problème récemment avec le Jeu de Cadre 2.6.3, ce qui m'a aidé c'était ça:
https://www.playframework.com/documentation/2.6.x/ThreadPools#Application-class-loader
Je laisse cette info ici pour les personnes qui pourraient avoir le même problème.
Pour la rendre plus claire, ce qui aide, c'est:
L'injection de l'Application sur un Désireux de Singleton et puis, à l'aide de son chargeur de classe de charger les classes j'ai eu des problèmes avec.
Pour la rendre plus claire
L'exemple ici https://playframework.com/documentation/2.6.x/JavaDependencyInjection#Configurable-bindings
Qui utilise
Environment
jette souvent un sentiment de frustrationClassNotFoundException
Acclamations