2011-05-23 8 views
18

¿Hay alguna forma de especificar un tipo predeterminado para una plantilla genérica?Java: ¿Cómo establecer un valor predeterminado para "T" en SomeClass <T>?

Digamos que tengo una clase Monkey. Los monos pueden vivir en diferentes Environment s, como Jungle o Zoo:

 
    public class Monkey<T extends Environment> 
    { 
     T home; 
     ... 

     public T getHome() 
     { 
      return home; 
     } 
    } 

¿Hay una manera de especificar un valor predeterminado para T, por lo que puede utilizar el tipo Monkey en lugar de Monkey<?> sin conseguir una advertencia del compilador?

EDITAR

En otras palabras, hay una manera de deshacerse de la advertencia "Tipo de crudo" sin tener que suprimir de forma explícita?

+0

Sí, supongo 'tipo bruto' es el valor predeterminado. El único problema son las advertencias. – Tom

+0

¿alguien puede verificar si esta respuesta es correcta? http://stackoverflow.com/questions/40466553/extending-arraylist-with-determined-default-member-type – 1412

Respuesta

20

No, no puedes hacer eso. Los parámetros genéricos no tienen valores predeterminados. Podría reorganizar su jerarquía de tipos para que haya una GenericMonkey y una DefaultMonkey que establezca el parámetro genérico a su valor predeterminado deseado.

4

No, no puedes: http://en.wikipedia.org/wiki/Comparison_of_Java_and_C%2B%2B

parámetros de tipo genérico no pueden tener argumentos por defecto.

Lo que trata de hacer algo como esto:

public class Monkey extends Monkey<YourType> 

Obviusly podrás "pérdida" la capacidad para heredar.

EDIT 1: Otra cosa interesante es hacer lo contrario de lo que he sugerido,

public class Monkey<T> extends Monkey 

En este caso todo Mono clase genéricos hereda del mono, en algunos casos, esto es una cosa muy interesante (especialmente cuando observa que algunos métodos de instancia se ajustan a todas las clases sin requerir el genérico). Este enfoque se usa en Castle ActiveRecord (lo he visto usado en C#, no en Java), y me parece hermoso.

+1

Ambos tienen que estar en diferentes archivos (supongo que sí porque en Java solo puede haber una clase pública) por archivo)? En ese caso, ¿qué nombre eliges? (Ya que es Mono y otro MOnkey. –

+0

Bueno, esto no es un problema que realmente piense, pero puedes nombrar el archivo que contiene Monkey (sin params genéricos) solo "Mono". el mono genérico MonkeyGeneric o Monkey_T_ como prefiera –

+1

¿No se supone que el nombre del archivo java es el mismo que el nombre de la clase pública? Básicamente tenía curiosidad sobre qué nombre elegiría para Monkey si ya hay una clase que se llama como Monkey.java. –

1

¿Por qué no utilizar la clase base del Genérico? Monkey<Environment>?

+0

El entorno podría ser abstracto, no lo sabemos. –

+0

Podría, es por eso que pregunto. Sin embargo, ¿no debería el tipo genérico ser un resumen o incluso una interfaz? – Zak

+0

'Medio ambiente' siempre será concreto. –

1

Jen, su pregunta no pone ningún contexto sobre por qué quiere usar un genérico. Sería realmente útil si declaras qué es lo que estás tratando de hacer y por qué estás usando genéricos. Los genéricos existen IMHO principalmente para evitar tener que hacer bloqueos de clase en todas partes al poner cosas y sacarlas de colecciones que están diseñadas para ser titulares genéricos de tipos. Este un poco implica iteración sobre un montón de cosas, pero no necesariamente.

Lo que quiero decir es que no vi ninguna parte de su clase o código que requiriera poder crear una versión personalizada de la clase mono que requiriera iterar sobre los entornos. Si este no es el caso, probablemente ni siquiera necesites medicamentos genéricos. En cambio, es probable que desee una inyección de dependencia. La clase de mono debe tener un constructor que tome un entorno. El entorno es una interfaz (o clase base simple). La interfaz tiene varias operaciones predeterminadas, como getBathroomLocation() y getFoodLocation().En lugar de utilizar genéricos para crear un tipo de mono que vive en el zoológico, se crea un mono y se inyecta la dependencia de las cuales el medio ambiente en que vive.

Monkey monkey = new Monkey(new CostaRicaJungle()); 

Más adelante, se puede establecer este entorno para algo diferente. El mono salvaje es capturado, y ahora hacer

monkey.setEnvironment(new BronxZoo()); 

Más tarde, el mono recibe una actualización condiciones de vida, y lo hace un

monkey.setEnvironment(new SanDiegoZoo()); 
Cuestiones relacionadas