java - parameter - Clase genérica que amplía la clase e implementa la interfaz
java generics (3)
Para reducir la dependencia de la clase, deseo enviar el parámetro (usando la clase genérica) al constructor que amplía alguna 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?
Además, usando mi clase T, quiero crear vistas, usando T.getActivity () como Contexto.
T debe extender Fragmento e implementar SomeInterface
En ese caso, podría declarar SomeClass
como el siguiente:
public class SomeClass<T extends Fragment & SomeInterface>
Eso requeriría un objeto de tipo T
para extender Fragment
e implementar SomeInterface
.
Además, usando mi clase T, quiero crear vistas, usando T.getActivity () como Contexto.
No estoy familiarizado con Android, pero si getActivity()
es un método de instancia pública declarado en Fragment
, será totalmente posible llamarlo a una instancia de T
, ya que el compilador sabrá que todas las T
deben heredar ese método.
¿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, ¿qué es Android específico sobre tu pregunta? Creo que me debe estar perdiendo algo, así que ¿puedes proporcionar más detalles?
actualizar a continuación
Todavía no estoy totalmente seguro de lo que quiere hacer, y tampoco estoy seguro de que deba preocuparse por la dependencia de inmediato, pero esto también es legal, utilizando parámetros de tipo delimitados :
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
e implementar SomeInterface
.
Es fácil si entiendo que lo corrigen para que tenga algún tipo T que extienda Fragmento e implemente alguna interfaz. Entonces tienes que escribir algo así.
abstract class TemplateFragment extends Fragment implements SomeInterface{}
y luego en tus clases
class SomeClass<T extends TemplateFragment> {
...
}
Hará el truco.