2017-06-14 83 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

隨着你的代碼和我以前有什麼,我得到一個編譯錯誤在每一行「目標方法是通用的」 –