Mejor manera de evitar el casteo



   AUTOR PREGUNTA

Publicado 18 noviembre 2014 - 02:30

Tengo la siguiente interfaz:

public interface Foo {
public void test();
}

Esta clase implementa la interfaz anterior:

public class FooChild implements Foo {
@Override public void test() {...}
public void test2() {...} }

Tengo que ademas llamar al metodo test2 en alguna parte de mi codigo:

Foo f = new FooChild(); ((FooChild) f).test2();
realmente no me gusta castear una interfaz a una clase asi que añadi  otra interfaz:
public interface Bar extends Foo {
public void test2(); }
public class FooChild implements Bar {
@Override public void test() {...}
@Override public void test2() {...} }

Ahora puedo usar test2() con un casteo a una interfaz no una clase

Foo f = new FooChild(); ((Bar) f).test2();

Pudiese añadir test2 a la interfaz Foo pero hay demasiadas clases que implementan Foo, si añado una funcion tengo que añadir codigos a todos las clases que implemente Foo.

Pero si pudiese hacer esto de igual forma no pudiese ya que no tengo permisos para editar Foo.

Existe una manera mucho mejor de hacer esto? mejor si es sin castear


¿Tienes la misma pregunta? Yo también

 

Publicado 18 noviembre 2014 - 20:26

Prueba con lo siguiente:

public FooChild getImpl(Foo input){
if (input instanceof FooChild){
return (FooChild)input;
}else{ return null; } }

 

Publicado 18 noviembre 2014 - 20:26

Esto quiza te pueda funcionar:
Bar f = new FooChild();
f.test2();

 

Publicado 18 noviembre 2014 - 20:27

No hay nada que puedas hacer para evitar el casteo, lo mejor es que uses un metodo parametrizado:

public void metodoAccion(Foo f) {
((FooChild) f).test2();
}

   AUTOR PREGUNTA

Publicado 18 noviembre 2014 - 20:36

Gracia felipe