chamada desmarcada para ... como um membro de um tipo cru

J.Doe:

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?

Andy Turner:
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 detailassim:

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.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=202863&siteId=1
Recomendado
Clasificación