llamada sin marcar para ... como miembro de un tipo de prima

J.Doe:

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?

Andy Turner:
DetailToBriefConverter detailToBriefConverter = mainApp.map.get(type);

detailToBriefConverteres 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 detailla 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.

Supongo que te gusta

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