He agregado un archivo de configuración legible para mi aplicación usando java.util.Properties
y estoy tratando de agregar un envoltorio para facilitar las conversiones de tipo. Específicamente, deseo que el valor devuelto "herede" su tipo del valor predeterminado proporcionado. Esto es lo que tengo hasta ahora:¿Cómo puedo instanciar un tipo genérico en Java?
protected <T> T getProperty(String key, T fallback) {
String value = properties.getProperty(key);
if (value == null) {
return fallback;
} else {
return new T(value);
}
}
El valor de retorno de getProperty("foo", true)
sería entonces un valor lógico, independientemente de si se lee desde el archivo de propiedades y de manera similar para las cadenas, enteros, dobles, & c. Por supuesto, el fragmento anterior en realidad no compilar:
PropertiesExample.java:35: unexpected type
found : type parameter T
required: class
return new T(value);
^
1 error
estoy haciendo esto mal, o estoy simplemente tratando de hacer algo que no se puede hacer?
Editar: Ejemplo de uso:
// I'm trying to simplify this...
protected void func1() {
foobar = new Integer(properties.getProperty("foobar", "210"));
foobaz = new Boolean(properties.getProperty("foobaz", "true"));
}
// ...into this...
protected void func2() {
foobar = getProperty("foobar", 210);
foobaz = getProperty("foobaz", true);
}
Incluso con un constructor predeterminado, es mejor usar un objeto 'Constructor' que usar' Class.newInstance() '. El manejo de errores es diferente; utilizando el método 'Clase ', algunas excepciones se informan con un tipo engañoso. El método 'Constructor' es consistente con otras invocaciones dinámicas. – erickson
@Kublai Khan - ¡Funciona! Mejor aún, pude obtener 'klazz' como' Clase klazz = (Clase ) fallback.getClass(); 'para eliminar el parámetro adicional. ¡Muchas gracias por su ayuda! ** Editar: ** Empecé a preguntarme sobre el almacenamiento en caché tan pronto como la reflexión entró en escena; Veré bloques estáticos para eso. –
Me alegro de poder ayudar. Solo tenga en cuenta que todas las búsquedas dinámicas que utilizan el reflejo son bastante costosas, ya que no se pueden optimizar en tiempo de compilación. –