Java泛型来简化方法调用

时间:2017-06-14 06:03:46

标签: java design-patterns java-8

我正在开发一个小项目,涉及使用相应的数据对正确的服务方法进行一些服务调用。我尝试使用以下玩具问题/解决方案解决它,但我对泛型的了解有点弱,并且它不起作用:

 ArrayList<String> sampleArrayList=new ArrayList<String>();
 HashSet<String> ArrayList2 = new HashSet<String>();
 ArrayList2.addAll(sampleArrayList);
 sampleArrayList.clear();
 sampleArrayList.addAll(ArrayList2);

基本上,鉴于上述情况,我尝试将三种类型的对象发送到我的服务。他们真的不共享共同的领域(所有三个无视id)。我正在尝试执行以下操作:对于我收到的每个有效负载,将其写入服务并将其打印到控制台。最后我想得到这个:

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;
}

在上面的行中,我收到有关HANDLERS.get(..)的编译器警告有原始类型,因此结果被删除。有人可以指导我一个解决方案吗?

1 个答案:

答案 0 :(得分:0)

HANDLERSHandler的集合(不是吗?) 因此,编译器无法猜测哪个泛型实现将从调用get()返回。

您必须更改方法签名以便变量,您将结果分配给控制泛型:

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