Estou a conversão de dados das pessoas em forma condensada. Então, eu tenho um monte de interfaces:
public interface Brief {}
public interface Detail {}
public interface DetailToBriefConverter<T extends Detail, R extends Brief> {
R convert(T detail);
}
, Um monte de pojos:
public class StudentBrief implements Brief {...}
public class StudentDetail implements Detail {...}
public class EmployeeBrief implements Brief {...}
public class EmployeeDetail implements Detail {...}
e conversores:
public class StudentDetailToBriefConverter implements DetailToBriefConverter<StudentDetail, StudentBrief> {
@Override
public StudentBrief convert(StudentDetail detail) {
// logic here
}
}
etc.
Minha classe principal parece mais ou menos assim:
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);
}
}
E isso funciona, mas eu recebo um aviso unchecked call to convert(T) as a member of a raw type DetailToBriefConverter
.
Como posso me livrar deste aviso ou que eu tenho que viver com isso?
DetailToBriefConverter detailToBriefConverter = mainApp.map.get(type);
detailToBriefConverter
é um tipo de matéria: você não está dando a ele um parâmetro de tipo. Nem você está dando a ele um no mapa.
Dado que você está colocando tipos heterogêneos no mapa, o único tipo de parâmetro você pode usar é <?, ?>
:
DetailToBriefConverter<?, ?> detailToBriefConverter = mainApp.map.get(type);
(Adicioná-lo à declaração mapa também)
Mas, então, você tem o problema que você não pode chamar detail
assim:
detailToBriefConverter.convert(detail);
porque o tipo do parâmetro é ?
, e você tem uma EmployeeDetail
, ou o que é chamado.
Basicamente, o que você está tentando fazer não é tipo seguro. É possível que você pode escrever o código de uma maneira tal que você realmente não obter quaisquer exceções de tempo de execução; mas é bastante frágil.
O que você realmente precisa é de um recipiente heterogêneo tipo seguro. Procurá-lo em Effective Java ou em outro lugar.