本文提到的類型擦除與java中的重載有關。我們先看一下重載的定義:重載是Java多态性的表現,是用統一的處理方式處理不同資料的機制。Java方法的重載,即方法具有相同的命名,但參數清單(類型或個數)不同。
以下是我寫的兩個方法,用于将使用者清單或不同類型使用者清單的List加入包含收件人、主題、郵件正文的一個資料結構中。如下:
1
2
3
4
<code>private</code> <code>void</code> <code>addEmailRecipients(FlowRunTime startFlowRunTime,</code>
<code> </code><code>List<String> userIds, ProcessContext context, List<Task> taskList) </code>
<code>private</code> <code>void</code> <code>addEmailRecipients(FlowRunTime startFlowRunTime, List<Set<String>> userSetList, </code>
<code> </code><code>ProcessContext context, List<Task> taskList)</code>
不仔細觀察,參數清單是相似的,唯一的差別是第二個參數,方法1為List<String>、方法2為List<Set<String>>,我認為這樣的參數清單是不同的,可以認定為重載。
但在儲存時,編譯器報出如下錯誤:
Method addEmailRecipients(FlowRunTime, List<String>, ProcessContext, List<Task>) has the same erasure addEmailRecipients(FlowRunTime, List<E>, ProcessContext, List<E>) as another
method in type ProcessActivityService
文章主要講了Java文法中泛型的實作。下面是我對上篇文章讀後的簡單總結:
泛型是一種将參數類型作為參數實作更廣泛應用的一種機制,在C++、C#中有所謂模闆與泛型的機制是相似的。Java中的泛型與其他語言的泛型實作機制不同,是一種基于擦除的僞泛型。比如List<String>與List<Integer>在代碼編寫期間是不同的,但在編譯好的位元組碼檔案中卻都被轉化為原生類型。我們知道JDK1.5出現之前類似泛型的實作是通過繼續以及類型強轉實作,在位元組碼檔案中泛型好像又回到了JDK1.5出現之前。關于Java為什麼使用這種機制實作泛型,不同的人有不同的解決,比如效率等。但比如我們上述代碼中的兩個方法,如我們将其中一個傳回值改為其他類型,編譯是可以通過的。文章又對所謂的特征簽名(源碼簽名,隻包含參數類型、個數等)和方法描述(位元組碼簽名,包括參數清單和傳回值、原生類型等)進行了解釋。重載是根據位元組碼的特殊簽名,而傳回值不參與特殊簽名;但原本報類型擦除錯誤的方法加上不同傳回值卻可以通過編譯,這是因為隻要兩個具有不同方法描述的方法均可以存在于同一個位元組碼檔案中,是以通過了編譯。另外,文章還對為什麼類型在編譯後被擦除,我們卻可以通過反射等機制得到其原始類型。這是因為類型擦除了code級别的位元組碼檔案,但特殊簽名中包含的中繼資料特殊簽名保留了原始類型。
2.2.1) ERROR 1222 (21000): The used SELECT statements have a different number of columns :
這是因為使用union的兩個SQL語句産生的記錄的表結構不一緻. 必須是結構完全一緻的記錄集合才可以使用UNION.以上就是兩個表的字段不一樣導緻。下面是我們使用的sql。這是一個查詢所有代碼工作的語句。前半部分是查詢所有OA中的jbpm待辦,而下半部分則是查詢所有來自另外系統的待辦工作。因為新需求需要在OA的jbpm待辦中新增委托人、轉交人等屬性,而其他系統的待辦工作則沒有類似概念。兩個UNION語句之間出現了表結構的不一緻導緻了上面的錯誤。
解決方法:
<code>''</code> <code>as</code> <code>newFiled</code>
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<code><</code><code>select</code> <code>id</code><code>=</code><code>"queryMyTodoTask"</code> <code>resultMap</code><code>=</code><code>"ExecutionResultMap"</code> <code>parameterType</code><code>=</code><code>"com.fx.oa.module.bpm.workflow.api.shared.domain.ProcessExecutionEntity"</code><code>></code>
<code> </code><code>SELECT</code>
<code> </code><code>pexec.id,</code>
<code> </code><code>ptask.taskId,</code>
<code> </code><code>ptask.activityName,</code>
<code> </code><code>ptask.substituteUserCode,</code>
<code> </code><code>pexec.processDefineId,</code>
<code> </code><code>pdefine.name,</code>
<code> </code><code>pexec.processInstanceId,</code>
<code> </code><code>pexec.tableName,</code>
<code> </code><code>pexec.formDefineId,</code>
<code> </code><code>pexec.pkValue,</code>
<code> </code><code>pexec.urgencyDegree,</code>
<code> </code><code>suser.userName as 'createUserCode',</code>
<code> </code><code>pexec.createTime,</code>
<code> </code><code>pexec.active,</code>
<code> </code><code>pexec.status,</code>
<code> </code><code>pexec.id AS todoUrl,</code>
<code> </code><code>pexec.id AS relateid,</code>
<code> </code><code>pexec.id AS domain</code>
<code> </code><code>FROM</code>
<code> </code><code>t_bpm_process_task ptask</code>
<code> </code><code>LEFT OUTER JOIN t_bpm_process_execution pexec ON ptask.processExecutionId = pexec.id</code>
<code> </code><code>LEFT OUTER JOIN t_bpm_process_define pdefine ON pexec.processDefineId = pdefine.id</code>
<code> </code><code>LEFT OUTER JOIN t_sys_user suser ON pexec.createUserCode = suser.userCode and suser.accessControl='Y'</code>
<code> </code><code>WHERE ptask.taskId IN (</code>
<code> </code><code>SELECT DISTINCT</code>
<code> </code><code>taskimpl.dbid_</code>
<code> </code><code>FROM</code>
<code> </code><code>jbpm4_task taskimpl</code>
<code> </code><code>LEFT OUTER JOIN jbpm4_participation participat ON taskimpl.dbid_ = participat.task_</code>
<code> </code><code>WHERE</code>
<code> </code><code>taskimpl.assignee_ = #{createUserCode}</code>
<code> </code><code>OR (taskimpl.assignee_ IS NULL</code>
<code> </code><code>AND participat.type_ = 'candidate'</code>
<code> </code><code>AND participat.userid_ = #{createUserCode})</code>
<code> </code><code>)</code>
<code> </code><code>AND ptask.STATUS = 0 </code>
<code> </code><code>AND pexec.STATUS IN (1, 6,8)</code>
<code> </code><code>AND pexec.active = 'Y'</code>
<code> </code><code><!--</code>
<code> </code><code><if test="createUserCode != null and createUserCode !=''"></code>
<code> </code><code>AND ptask.createUserCode = #{createUserCode}</code>
<code> </code><code></if></code>
<code> </code><code>--></code>
<code> </code><code><</code><code>if</code> <code>test</code><code>=</code><code>"createUserName != null and createUserName !=''"</code><code>></code>
<code> </code><code>AND suser.userName LIKE '%' #{createUserName} '%' </code>
<code> </code><code></</code><code>if</code><code>></code>
<code> </code><code><</code><code>if</code> <code>test</code><code>=</code><code>"name != null and name !=''"</code><code>></code>
<code> </code><code>AND pdefine.name LIKE '%' #{name} '%' </code>
<code> </code><code><</code><code>if</code> <code>test</code><code>=</code><code>"startCreateTime != null and startCreateTime !=''"</code><code>></code>
<code> </code><code>AND pexec.createTime </code><code><![CDATA[>= #{startCreateTime} ]]></code>
<code> </code><code><</code><code>if</code> <code>test</code><code>=</code><code>"endCreateTime != null and endCreateTime !=''"</code><code>></code>
<code> </code><code>AND pexec.createTime </code><code><![CDATA[<= #{endCreateTime}]]></code>
<code> </code><code>UNION </code>
<code> </code><code>SELECT </code>
<code> </code><code>todo.p_relate_id AS id,</code>
<code> </code><code>todo.id AS taskId,</code>
<code> </code><code>todo.p_activity_name AS activityName ,</code>
<code> </code><code>todo.p_relate_id AS processDefineId,</code>
<code> </code><code>'' as substituteUserCode,</code>
<code> </code><code>todo.p_task_name AS NAME ,</code>
<code> </code><code>todo.p_relate_id AS processInstanceId,</code>
<code> </code><code>todo.p_relate_id AS tableName,</code>
<code> </code><code>todo.p_relate_id AS formDefineId,</code>
<code> </code><code>todo.p_relate_id AS pkValue,</code>
<code> </code><code>todo.p_urgency_degree AS urgencyDegree ,</code>
<code> </code><code>todo.p_applicant_name AS createUserCode ,</code>
<code> </code><code>todo.p_applicant_time AS createTime ,</code>
<code> </code><code>'Y' AS active,</code>
<code> </code><code>todo.p_urgency_degree AS STATUS ,</code>
<code> </code><code>todo.p_url AS todoUrl ,</code>
<code> </code><code>todo.id AS relateid ,</code>
<code> </code><code>todo.p_domain AS domain </code>
<code> </code><code>FROM m_Todo todo</code>
<code> </code><code>where 1=1</code>
<code> </code><code>AND todo.p_approval_id = #{createUserCode}</code>
<code> </code><code>AND todo.p_applicant_name LIKE '%' #{createUserName} '%' </code>
<code> </code><code>AND todo.p_task_name LIKE '%' #{name} '%' </code>
<code> </code><code>AND todo.p_applicant_time </code><code><![CDATA[>= #{startCreateTime} ]]></code>
<code> </code><code>AND todo.p_applicant_time </code><code><![CDATA[<= #{endCreateTime}]]></code>
<code> </code><code>ORDER BY</code>
<code> </code><code>createTime DESC</code>
<code> </code><code></</code><code>select</code><code>></code>
<code></code>
本文轉自 gaochaojs 51CTO部落格,原文連結:http://blog.51cto.com/jncumter/1622182,如需轉載請自行聯系原作者