2017-06-14 110 views
0

我正在研究一个小项目,它涉及使用相应的数据对正确的服务方法进行一些服务调用。我已经尝试使用下面的玩具问题/解决方案来解决这个问题,但我的仿制药的知识是有点弱,它不相当的工作:简化方法调用的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(..)编译器警告有原始类型,这样的结果将被删除。任何人都可以请指导我解决方案?

+0

编译器就在警告你,你的类型*是*坏了,因为'处理器.apply'签名是'(User,T) - > Collection '',而您的保存方法的签名是'(User,Collection ) - > Collection ',它不匹配,但使用* raw type *'Handler '隐藏这个。 – Holger

+0

@Holger修正了这个错字,虽然有相同的错误 –

+0

好了,警告告诉你编译器无法识别这样的错误;事实上,你真的有这样的错误是一个很好的例子,但修复错误不会改变编译器无法识别是否存在这样的错误的事实,所以警告仍然存在。恐怕,对于你所要做的事,没有一种安全的方式。 – Holger

回答

0

HANDLERSHandler集合(是不是?) 因此编译器无法猜测哪些通用的实现将调用返回get()

你有这样变量,分配结果来控制改变方法签名通用:

interface Handler<T> 
{ 
    <R> R apply(@Nonnull User user, @Nonnull T data); 
} 
+0

为什么会有这个问题与问题中定义的T相同?另外,我认为我遇到的问题之一是在这个片段中:private static final Map HANDLERS。该处理程序没有任何类型的信息 –

+1

@JohnBaum你不能在那里指定通用的,因为你的地图可以洞一个处理程序类型消失地图的整个目的... –

+0

随着你的代码和我以前有什么,我得到一个编译错误在每一行“目标方法是通用的” –