我正在研究一个小项目,它涉及使用相应的数据对正确的服务方法进行一些服务调用。我已经尝试使用下面的玩具问题/解决方案来解决这个问题,但我的仿制药的知识是有点弱,它不相当的工作:简化方法调用的Java泛型
interface Handler<T>
{
Collection<T> apply(@Nonnull User user, @Nonnull Collection<T> data);
}
private static final Map<Type, Handler> HANDLERS = ImmutableMap.<Type, Handler>builder()
.put(Type.STUDENTS, (user, data) -> Service.saveStudents(user, data))
.put(Type.TEACHERS, (user, data) -> Service.saveTeachers(user, data))
.put(Type.CLASSROOM, (user, data) -> Service.saveClassrooms(user, data))
.build();
public class Service {
Collection<Student> saveStudents(User user, Collection<Student> students);
Collection<Teacher> saveTeachers(User user, Collection<Teacher> teachers);
Collection<Classroom> saveClassRooms(User user, Collection<Classroom> classrooms);
}
class Teacher {
int id;
String firstName;
String lastName;
int salary;
...
}
class Student {
int id;
String firstName;
String lastName;
int grade;
...
}
class Classroom {
int id;
int floor;
...
}
class Payload<T> {
Type type;
Collection<T> dataToBeSaved;
}
基本上,鉴于上述背景下,我有三种类型的对象是我尝试发送给我的服务。他们没有真正分享共同的领域(跨越所有三个无视的id)。我正在尝试执行以下操作:对于我收到的每个有效内容,将其写入服务并将其打印到控制台。最后,我希望得到这样的:
if (payload.type.equals(Type.STUDENTS)) {
Collection<Students> studentsWrittenToService = HANDLERS.get(type).apply(user, payload.data);
}
在上面的纹路,我得到HANDLERS.get(..)编译器警告有原始类型,这样的结果将被删除。任何人都可以请指导我解决方案?
编译器就在警告你,你的类型*是*坏了,因为'处理器.apply'签名是'(User,T) - > Collection'',而您的保存方法的签名是'(User,Collection ) - > Collection ',它不匹配,但使用* raw type *'Handler '隐藏这个。 –
Holger
@Holger修正了这个错字,虽然有相同的错误 –
好了,警告告诉你编译器无法识别这样的错误;事实上,你真的有这样的错误是一个很好的例子,但修复错误不会改变编译器无法识别是否存在这样的错误的事实,所以警告仍然存在。恐怕,对于你所要做的事,没有一种安全的方式。 – Holger