Estoy convertir los datos de las personas en forma condensada. Así que tengo un montón de interfaces:
public interface Brief {}
public interface Detail {}
public interface DetailToBriefConverter<T extends Detail, R extends Brief> {
R convert(T detail);
}
, Un montón de POJOs:
public class StudentBrief implements Brief {...}
public class StudentDetail implements Detail {...}
public class EmployeeBrief implements Brief {...}
public class EmployeeDetail implements Detail {...}
y convertidores:
public class StudentDetailToBriefConverter implements DetailToBriefConverter<StudentDetail, StudentBrief> {
@Override
public StudentBrief convert(StudentDetail detail) {
// logic here
}
}
etcétera
Mi clase principal se ve más o menos así:
public class MainApp {
private Map<String, DetailToBriefConverter> map = ImmutableMap.<String, DetailToBriefConverter>builder()
.put("employee", new EmployeeDetailToBriefConverter())
.put("student", new StudentDetailToBriefConverter())
.build();
public static void main(String[] args) {
MainApp mainApp = new MainApp();
String type = "employee"; // comes from the request actually
Detail detail = new EmployeeDetail(); // comes from the request
DetailToBriefConverter detailToBriefConverter = mainApp.map.get(type);
detailToBriefConverter.convert(detail);
}
}
Y esto funciona, pero me da una advertencia unchecked call to convert(T) as a member of a raw type DetailToBriefConverter
.
¿Cómo puedo deshacerme de esta advertencia o tengo que vivir con ella?
DetailToBriefConverter detailToBriefConverter = mainApp.map.get(type);
detailToBriefConverter
es un tipo cruda: no se está dando un parámetro de tipo. Tampoco se lo estás dando una en el mapa.
Teniendo en cuenta que usted está poniendo tipos heterogéneos en el mapa, el único tipo de parámetro que puede utilizar es <?, ?>
:
DetailToBriefConverter<?, ?> detailToBriefConverter = mainApp.map.get(type);
(Añadirlo a la declaración mapa también)
Pero entonces usted tiene el problema de que no se puede invocar detail
la siguiente manera:
detailToBriefConverter.convert(detail);
debido a que el tipo del parámetro es ?
, y usted tiene una EmployeeDetail
, o lo que se llama.
Básicamente, lo que estamos tratando de hacer no es de tipo seguro. Es posible que se puede escribir el código de tal manera que en realidad no llega ninguna excepción en tiempo de ejecución; pero es bastante frágil.
Lo que realmente necesita es un recipiente heterogénea de tipo seguro. Búsquelo en Effective Java o en otro lugar.