Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] hallar la clase que implementa la factoria

Estas en el tema de hallar la clase que implementa la factoria en el foro de Java en Foros del Web. Buen dia compañeros del foro, tengo un dilema que no he podido resolver. en el siguiente fragmento de codigo @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Java: Ver original ...
  #1 (permalink)  
Antiguo 08/06/2019, 09:20
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 154
Antigüedad: 6 años, 2 meses
Puntos: 2
hallar la clase que implementa la factoria

Buen dia compañeros del foro, tengo un dilema que no he podido resolver.

en el siguiente fragmento de codigo

Código Java:
Ver original
  1. ComponenteBase base=(ComponenteBase) BuscadorFactoria.getFaces();

BuscadorFactoria es una clase concreta y el metodo getFaces(), es un metodo que devuelve un objeto de tipo Object,Como sigue:

Código Java:
Ver original
  1. public class BuscadorFactoria{  
  2.  
  3.     public static Object getFaces() {
  4.         return new Object();
  5.     }    
  6.     void enTres(){
  7.         System.out.println("metodo propio de Tres");
  8.     }
  9. }

ComponenteBase es una clase abstracta como la siguiente

Código Java:
Ver original
  1. public abstract class ComponenteBase extends Object implements EnvoltorCara<ComponenteBase>{
  2. @Override
  3.     public ComponenteBase getWraped(){        
  4.         return (ComponenteBase) new Object();
  5.     }
  6. }

y en la clase Main como la que sigue

Código Java:
Ver original
  1. public class Main {
  2.     public static void main(String[] args) {
  3.         ComponenteBase base=(ComponenteBase) BuscadorFactoria.getFaces();
  4.        
  5.     }
  6. }

Me devuelve un error como el que sigue:
Código Java:
Ver original
  1. Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot be cast to pruebas.ComponenteBase

Pero cuando me voy a la api de JavaServer Faces en la API de javax.faces.Application, y abro la documentacion de la clase AplicationFactory en la descripcion de la clase me muestra el siguiente fragmento de codigo:
Código Java:
Ver original
  1. ApplicationFactory factory = (ApplicationFactory)
  2.     FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY);

y la cabeza de la clase es la siguiente:
Código Java:
Ver original
  1. public abstract class ApplicationFactory
  2. extends Object
  3. implements FacesWrapper<ApplicationFactory>
donde Obviamente ApplicationFactory es abstracta, no se como sera ahì, por que si se fijan en la parte de arriba dice que la ApplicationFactory hace un casting de un objeto y para eso se nesecita que halla alguna clase que herede de ApplicationFactory para poder trabajar, pero por mas que busco en la documentacion no hay una clase concreta que herede de la esta clase ni tampoco de la clase Application que es de la que se requiere devolver una instancia, pero cuando lo ensallo en mi computador si funciona y mi codigo no.
Que sera?.
De antemano muchas gracias.
  #2 (permalink)  
Antiguo 10/06/2019, 09:54
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 730
Antigüedad: 11 años, 2 meses
Puntos: 60
Respuesta: hallar la clase que implementa la factoria

Estas confundiendo lo que un cast puede hacer.

Si has creado un objeto de tipo X, no importa el tipo que sea X, solo lo puedes "mirar" (manipular) como si fuera un objeto de tipo X o cualquiera de sus clases base y las interfaces que implementa.

O sea si X deriva de Y e implementa Z, puedes "mirar" a X como si fuera un X, un Y o un Z.

Lo que ocurre es que:
- Todos las clases tienen como base ultima a la clase Object.
- Algunos metodos dicen que retornaran un Object, lo que es una manera generica de decir que retornaran cualquier tipo de datos.

Pero esto no significa que si creaste un objeto de tipo Object, este pueda ser convertido a un objeto de tipo X. Es solo si fue creado como X que puede ser "mirado" como X.

Cita:
Object object = metodo_que_manipula_objeto(); // valido

X objetoX = (X) metodo_que_manipula_objeto(); // solo valido si el objeto manipulado es de tipo X.
Tal vez quieras hacer un new de una clase concreta que sea o bien ComponenteBase o una derivada de esta, en la factoria, para que el cast no te reclame, y crear un objeto de una clase concreta en el metodo de ComponenteBase.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 10/06/2019, 15:17
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 154
Antigüedad: 6 años, 2 meses
Puntos: 2
Respuesta: hallar la clase que implementa la factoria

CalgaryCorpus, gracias por tu aporte, explicación clara y contundente.



La zona horaria es GMT -6. Ahora son las 18:22.