2009-09-04 20 views
11

¿Es posible especificar el tipo predeterminado al parametrizar una clase? Ejemplo:Parametrización opcional en Java con genéricos

// abstract class  
public abstract class AbsClass<T1 extends Par1Class, T2 extends Par2Class> { 
     // code 
    } 


// parametrized imlementation class 
public class RealClass extends AbsClass<ClassThatExtendsPar1, ClassThatExtendsPar2Class> { 
    // code 
} 

// non-parametrized imlementation class 
public class RealClass extends AbsClass { 
    // code 
} 

en mi aplicación que tiene que especificar ninguno o todos los parámetros. Es posible hacer que el segundo parámetro no obligatorio, algo como esto:

// abstract class  
public abstract class AbsClass<T1 extends Par1Class, T2 extends Par2Class : default Par2Class > { 
     // code 
    } 

// parametrized only mandatory imlementation class 
public class RealClass extends AbsClass<ClassThatExtendsPar1> { 
    // code 
} 

Respuesta

18

Respuesta simple: no, Java no soporta parametrizaciones por defecto el estilo.

1

Nunca hay realmente una buena razón para hacer esto. Normalmente especifica los parámetros de tipo genérico porque algunos argumentos de método toman o devuelven un parámetro de ese tipo. Si no se especificaron eran válidos, eso parecería sugerir que usted tenía la intención de no realizar ninguna implementación significativa de esos métodos.

De todos modos, para resolver su problema percibido, simplemente especifique "Objeto" para cualquier parámetro de tipo que no desee especificar. O amplíe la clase abstracta con otra clase abstracta que tenga solo un parámetro de tipo (especificando Object como el segundo parámetro de tipo en su llamada extendida).

+1

Desde mi punto de vista hay una buena razón de hacer esto. Debido a que mi "parámetro opcional" (T2 extiende Par2Class) es una Clase que usamos como un Objeto de Valor y se extiende en lotes de otras clases. Si no especifico el T2, solo uso los métodos predeterminados de ValueObject. Si especifico, necesito métodos específicos y no tengo que emitir. Estaba pensando en introducir otra clase en el orden de herencia, pero tenía curiosidad acerca de la parametrización opcional. Gracias. – davorp

+0

Puedo estar equivocado, pero creo que hay tales casos de uso. En C++, donde se permiten los tipos de plantilla predeterminados, se usan, p. para proporcionar una versión predeterminada del asignador de memoria para tipos STL. – Rom1

+0

Un buen uso típico para esto sería el parámetro de tipo intermedio de SwingWorker, si es el mismo que el parámetro resultante. –

0

Bueno, la solución correcta para su caso puede ser

// parametrized only mandatory imlementation class 
public class RealClass<StillGeneric extends Par1Class> 
extends AbsClass<ClassThatExtendsPar1, StillGeneric> { 
    // code 
} 
+0

Pero necesito métodos "parametrizados" de AbsClass. Si parametrizo la RealClass, en mi caso no hay uso de ella. ¿O estoy juzgando mal algo? – davorp