usuario interfaz interfaces grafica ejemplos diseƱo java inheritance classcastexception

java - interfaces - no se puede convertir a la interfaz implementada



interfaz grafica swing java eclipse (2)

AKA cuando Java aparentemente no tiene Java.

Llegué a este problema recientemente con Play Framework 2.6.3, lo que me ayudó fue esto: https://www.playframework.com/documentation/2.6.x/ThreadPools#Application-class-loader

Dejo esta información aquí para las personas que puedan tener el mismo problema.

Para hacerlo más claro, lo que ayuda es:

Inyectando la aplicación en un Singleton ansioso y luego usando su cargador de clases para cargar las clases con las que estaba teniendo problemas.

Para hacerlo más claro

public class Module { @Override public void configure { bind(TheClassLoaderLoader.class).asEagerSingleton() public static class TheClassLoaderLoader { @Inject public TheClassLoaderLoader( Application application) { ClassLoader classloader = application.classloader(); Class<?> interfaceClass = classloader.loadClass(InterfaceClass.class.getName()); classloader.loadClass(ImplementsInterfaceClass.class.getName()).asSubclass(interfaceClass);

El ejemplo aquí https://playframework.com/documentation/2.6.x/JavaDependencyInjection#Configurable-bindings

Eso usa el Environment menudo arroja una frustrante ClassNotFoundException

Aclamaciones

estoy muy confundido...

Tengo una clase que implementa directamente una interfaz:

public class Device implements AutocompleteResult {...}

Aquí hay una prueba de que estoy buscando las variables correctas:

Object match = ...; log.debug(match.getClass()); // Outputs ''Device'' log.debug(match.getClass().getInterfaces()[0]); // Outputs ''AutocompleteResult''

Sin embargo, cuando intento enviar una instancia de la clase a la interfaz:

AutocompleteResult result = (AutocompleteResult) match;

¡Obtengo una ClassCastException!

ClassCastException: Device cannot be cast to AutocompleteResult

Además, isAssignableFrom devuelve false y no estoy seguro de por qué:

log.debug(AutocompleteResult.class.isAssignableFrom(Device.class));

del doc :

Determina si la clase o la interfaz representada por este objeto de clase es la misma o es una superclase o superinterfaz de la clase o interfaz representada por el parámetro de clase especificado.

¿No debería siempre poder lanzar un objeto a una interfaz que su clase implementa?

Gracias.


Esto puede suceder si dos cargadores de clases diferentes cargan una clase llamada AutocompleteResult .

Estas dos clases se tratan como clases completamente diferentes , incluso si tienen el mismo paquete y nombre (e incluso implementación / campos / métodos).

Una causa común para esto es si utiliza algún tipo de sistema de complemento y tanto sus clases base como las clases de complementos proporcionan la misma clase.

Para comprobar este problema, imprima el valor devuelto por Class.getClassLoader() en ambas clases ofensivas (es decir, la clase de la interfaz implementada por Device y el resultado de AutocompleteResult.class ).