我正在研究一個小項目,它涉及使用相應的數據對正確的服務方法進行一些服務調用。我已經嘗試使用下面的玩具問題/解決方案來解決這個問題,但我的仿製藥的知識是有點弱,它不相當的工作:簡化方法調用的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