Para reducir dependece de clase, quiero enviar parámetro (usando la clase genérica) a un constructor que se extiende algunos de la clase e implementa la interfaz, por ejemplo

public interface SomeInterface{
    public void someMethod();
}

public class MyFragment extends Fragment implements SomeInterface{
    //implementation
}

//here is classs, that I need to create. T must extend Fragment and implements 
//SomeInterface. But, I'm afraid, if I'll use MyFragment directly, it will create a
//dependence of SomeClass from MyFragment.

public class SomeClass /*generic?*/ {
    public SomeClass(T parent);
}

Es posible?

Más, con mi T clase, quiero crear vistas, el uso de T. getActivity() como Contexto.

  • Puedes dar más información? El uso de Java reflexión puede pasar un Class objeto en un método y que lo inspeccione y sus interfaces a través de getInterfaces(), así como obtener/llamar a un Constructor para hacer una nueva instancia. Pero su uso específico caso no es clara, por lo que es difícil de averiguar cómo la pieza de estos elementos juntos para resolver su problema en particular.
  • actualizado mi pregunta

3 Comentarios

  1. 119

    T debe extender Fragmento y aplicar SomeInterface

    En el caso de que usted podría declarar SomeClass como las siguientes:

    public class SomeClass<T extends Fragment & SomeInterface>

    Que requeriría un objeto de tipo T a fin de extender Fragment y aplicar SomeInterface.

    Más, con mi T clase, quiero crear vistas, el uso de T. getActivity() como Contexto.

    Estoy familiarizado con Android, pero si getActivity() es una instancia pública método declarado en Fragment entonces será posible llamar a una instancia de T, ya que el compilador sepa todo Ts debe heredar ese método.

    • +1 me pegaba a él.
    • ¿Cómo se utiliza Mockito para crear un simulacro de clase que es de tipo T?
    • Buena pregunta. Sospecho que tu clase de prueba puede ser que necesite para declarar un tipo como abstract class TestFragment extends Fragment implements SomeInterface y luego burlarse de ese tipo con TestFragment.class.
  2. 6

    ¿Quieres hacer algo como esto?

    class SomeClass {}
    
    interface SomeInterface{
        public void someMethod();
    }
    
    class AGenericClass<T> extends SomeClass implements SomeInterface {
        public void someMethod() {}
    }

    Esto está permitido.

    Pero lo que es Android específicas acerca de su pregunta? Creo que me debe faltar algo, así que puedes dar más detalles?

    de actualización a continuación

    Todavía no estoy totalmente seguro de lo que quieres hacer, y tampoco estoy seguro de que usted tiene que preocuparse acerca de la dependencia de inmediato, pero esto también es legal, mediante delimitado el tipo de parámetros:

    interface SomeInterface{
        public void someMethod();
    }
    
    class Fragment {
        public void aMethodInFragment() { }
    }
    
    public class SomeClass <T extends Fragment & SomeInterface> {
        public SomeClass(T parent) {
            parent.someMethod();
            parent.aMethodInFragment();
        }
    }

    El parámetro de tipo <T extends Fragment & SomeInterface> especifica que T debe ser una subclase de Fragment y aplicar SomeInterface.

    • Actualizado mi pregunta.
  3. 4

    Es fácil si lo entiendo correcto que usted tenga algún tipo T, el cual se extiende Fragmento y la implementación de algunas de interfaz. Así que tienes que escribir algo como eso.

    abstract class TemplateFragment extends Fragment implements SomeInterface{}

    y, a continuación, en sus clases

    class SomeClass<T extends TemplateFragment> {
    ...
    }

    Va a hacer el truco.

Dejar respuesta

Please enter your comment!
Please enter your name here