I'm converting people's data into condensed form. So I have a bunch of interfaces:
public interface Brief {}
public interface Detail {}
public interface DetailToBriefConverter<T extends Detail, R extends Brief> {
R convert(T detail);
}
, a bunch of pojos:
public class StudentBrief implements Brief {...}
public class StudentDetail implements Detail {...}
public class EmployeeBrief implements Brief {...}
public class EmployeeDetail implements Detail {...}
and converters:
public class StudentDetailToBriefConverter implements DetailToBriefConverter<StudentDetail, StudentBrief> {
@Override
public StudentBrief convert(StudentDetail detail) {
// logic here
}
}
etc.
My main class looks roughly like this:
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);
}
}
And this works, but I get a warning unchecked call to convert(T) as a member of a raw type DetailToBriefConverter
.
How can I get rid of this warning or do I have to live with it?
DetailToBriefConverter detailToBriefConverter = mainApp.map.get(type);
detailToBriefConverter
is a raw type: you aren't giving it a type parameter. Nor are you giving it one in the map.
Given that you are putting heterogeneous types into the map, the only type parameter you can use is <?, ?>
:
DetailToBriefConverter<?, ?> detailToBriefConverter = mainApp.map.get(type);
(add it to the map declaration too)
But then you've got the problem that you can't invoke detail
like this:
detailToBriefConverter.convert(detail);
because the type of the parameter is ?
, and you've got an EmployeeDetail
, or whatever it is called.
Basically, what you are trying to do isn't type safe. It is possible that you can write the code in such a way that you don't actually get any runtime exceptions; but it's rather brittle.
What you really need is a type-safe heterogeneous container. Look it up in Effective Java or elsewhere.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With