2016-02-22 59 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

相关问题