2016-02-22 92 views
0

我在這裏的服務代碼爲什麼列表<generic>不適用於Java的mybatis?

public HashMap<String, Object> syncEmployees(Long updatedAt, String userId) { 
    HashMap<String, Object> outputMap = new LinkedHashMap<String, Object>(); 
    **List<String>** outputEmployee = employeeDao.getEmployeeSyncDetails(updatedAt); 

     System.out.println("\n\n Size : "+outputEmployee.size()+"\nOutput : "+outputEmployee); 

    outputMap.put("employee", outputEmployee); 
    return outputMap; 
} 

道碼是返回類型爲字符串名單列表(字符串)

**List<String>** getEmployeeSyncDetails(@Param("updatedAt") long updatedAt); 

.XML映射器和查詢,其中方法返回xyzModel

名單
<resultMap id="xyzmap" type="xyzModel" > 
     <result property="userId" column="user_id" /> 
     <result property="employeeCode" column="employee_code" /> 
     <result property="designationId" column="designation_id" /> 

    </resultMap> 


<select id="getxyzDetails" resultMap="xyzmap"> 
    SELECT 
      user_id, ua.employee_code, designation_id 
    FROM users 
    WHERE updated_at &gt; #{updatedAt} 
    ORDER BY updated_at ASC 
</select> 

並且輸出像 尺寸:3 輸出:[com.webapp.models。 xyzModel @ 1567524c,com.webapp.models。 xyzModel @ 7744c2cd,com.webapp.models。 xyzModel @ 43515de7]

我的問題是它是如何工作的?如何xyzmodel在字符串 的名單得到填充其實我的問題是XML映射回xyzModel但如果我寫的其他型號一樣的usermodel或字符串或任何其他模型,可以不顯示任何錯誤或正確的輸出完美的執行。如果我們處理這個列表,那麼只有他發送錯誤java.lang.ClassCastException

+2

看起來像你對我還沒有覆蓋xyzModel'的'了'的toString()'方法。你的'List'中的每個元素都是調用''xyzModel''實例上'Object'提供的'toString()'實現的結果。該列表實際上不包含這些實例。 – JonK

+0

其實我的問題是XML映射回xyzModel但如果我寫的其他型號一樣的用戶或字符串或其他公司沒有顯示任何錯誤或正確的輸出完全執行反對票。如果我們處理此列表中,則只有他發送錯誤 –

+0

覆蓋toSting方法 –

回答

1

在運行時,沒有類型的泛型。

如果你想自己寫的代碼爲getEmployeeSyncDetails,你的編譯器會警告你這一點。

這裏大約類型擦除閱讀的java:https://docs.oracle.com/javase/tutorial/java/generics/erasure.html

+0

我擔心的是沒有關係的,爲什麼是類型擦除與此有關?這似乎是作者誤解「List」對象實際內容的一種情況。 – JonK

+0

也許我誤解了這個問題,但根據我的理解,他問怎麼來的儘管該方法實際上返回xyzModel的列表,它可以存儲類型列表中的變量。 –

+0

這就是誤解所在。列表* does *包含字符串。你不能把一個不是String的對象放到一個List中,該List將它的類型指定爲String。代碼可能會說'list.add(new xyzModel());',但編譯器會將其更改爲'list.add(new xyzModel()。toString());'。如果你還沒有提供'toString()'的實現,你可以從'Object'中得到默認的實現,它是類名後跟@符號,後面跟着對象散列碼的十六進制表示。這就是你可以在列表 – JonK

相關問題