Tengo la siguiente pregunta genéricos de Java
Tengo el siguiente parecían clase genérico puede ser esbozado como:
public class MyClass<T> {
AnotherClass<T> another;
OtherClass<T> other;
...
}
donde ...
representa el código que no es relevante para el caso.
Para la clase MyClass<T>
no es tan importante el tipo exacto T
es (a partir de ahora), pero para ambos:
AnotherClass<T>
OtherClass<T>
es absolutamente crucial que el tipo genérico es y las decisiones se hará en tiempo de ejecución en base a eso.
Basado en esto, el tipo T
no es completamente arbitraria, puede ser ya sea una instancia de una jerarquía de clases T_1
o una jerarquía de clases T_2
.
Como se define la clase, el tipo T
es equivalente a Object
, pero sé que es equivalente a cualquiera de los dos T_1
oT_2
No hay relación entre las entidades no businnes T_1
y T_2
por lo tanto no estoy haciendo:
public interface BaseT { ... }
public class T_1 implements BaseT { ... }
public class T_2 implements BaseT { ... }
public class MyClass<T extends BaseT>
Aclaración acerca de por qué el uso de un genérico si no están relacionados:
Estoy definiendo (tratando de) una clase genérica para ambos, porque incluso ellos no están relacionados especifique lo contrario, existe una relación implícita porque ambos T_1
y T_2
puede y aparecerá asociado a la entidad representada enMyClass
T
será el mismo para MyClass
, AnotherClass
y OtherClass
de manera que en un caso sólo habrá ya sea T_1
o T_2
pero nunca ambos al mismo tiempo.
Mi pregunta es, qué alternativas tengo aquí aparte de diseño de una interfaz para
MyClass
e implementarlo para ambosT_1
yT_2
?.Puedo lograr algo así
MyClass<T extends T_1 or T_2>
?
Saludos cordiales
Probablemente, esto no es exactamente lo que tu estás buscando, pero que podría darle una oportunidad:
Crear una abstract
clase genérica que implementa todo:
public abstract class MyClass<T>
{
AnotherClass<T> another;
OtherClass<T> other;
// Add any code needed
}
A continuación, cree 2 clases genéricas para ambas clases de base.
Estas clases pueden ser vacío si todo el código se puede implementar en el abstracto:
public class MyT1Class<T extends T_1> extends MyClass<T>
{
}
public class MyT2Class<T extends T_2> extends MyClass<T>
{
}