我有2個類實現相同的接口稱爲IProcess。2類實現相同的接口 - >拋出ClassCastException
IProcess.java
package org.XXX.module.workflow.bo.interfaces;
public interface IProcess extends IMasterObject {
INode getCurrentNode();
INode getPreviousNode();
long getLastChange();
IWorkflow getWorkflow();
}
頭等艙
package org.XXX.module.workflow.database.bo.impl;
import org.XXX.module.workflow.bo.interfaces.INode;
import org.XXX.module.workflow.bo.interfaces.IProcess;
import org.XXX.module.workflow.bo.interfaces.IWorkflow;
import org.XXX.module.workflow.database.jdbc.entity.ProcessEntity;
public class ProcessEntityWrapper implements IProcess {
private String id;
private INode currentNode;
private INode previousNode;
private long lastChange;
private IWorkflow workflow;
public ProcessEntityWrapper(ProcessEntity entity) {
this.id = entity.getId();
this.lastChange = entity.getLastChange();
}
@Override
public String getId() {
return id;
}
@Override
public INode getCurrentNode() {
return currentNode;
}
@Override
public INode getPreviousNode() {
return previousNode;
}
@Override
public long getLastChange() {
return lastChange;
}
@Override
public IWorkflow getWorkflow() {
return workflow;
}
/**
* @param currentNode the currentNode to set
*/
public void setCurrentNode(INode currentNode) {
this.currentNode = currentNode;
}
/**
* @param prevoiusNode the prevoiusNode to set
*/
public void setPreviousNode(INode previousNode) {
this.previousNode = previousNode;
}
/**
* @param workflow the workflow to set
*/
public void setWorkflow(IWorkflow workflow) {
this.workflow = workflow;
}
}
二等:
package org.XXX.module.workflow.bo.impl;
import org.XXX.module.workflow.bo.interfaces.INode;
import org.XXX.module.workflow.bo.interfaces.IProcess;
import org.XXX.module.workflow.bo.interfaces.IWorkflow;
public class Process implements IProcess {
public Process(String id, INode currentNode, INode previousNode,
long lastChange, IWorkflow workflow) {
this.id = id;
this.currentNode = currentNode;
this.previousNode = previousNode;
this.lastChange = lastChange;
this.workflow = workflow;
}
private String id;
private INode currentNode;
private INode previousNode;
private long lastChange;
private IWorkflow workflow;
@Override
public String getId() {
return id;
}
@Override
public INode getCurrentNode() {
return currentNode;
}
@Override
public INode getPreviousNode() {
return previousNode;
}
@Override
public long getLastChange() {
return lastChange;
}
@Override
public IWorkflow getWorkflow() {
return workflow;
}
/**
* @param currentNode the currentNode to set
*/
public void setCurrentNode(INode currentNode) {
this.currentNode = currentNode;
}
/**
* @param previousNode the previousNode to set
*/
public void setPreviousNode(INode previousNode) {
this.previousNode = previousNode;
}
/**
* @param lastChange the lastChange to set
*/
public void setLastChange(long lastChange) {
this.lastChange = lastChange;
}
}
部分,它拋出ClassCastException異常:
@Override
public void route(IProcess process, INode nextNode) {
if(initializedClient == null) {
return;
}
Process processImpl = (Process) process;
processImpl.setPreviousNode(process.getCurrentNode());
processImpl.setCurrentNode(nextNode);
dataAccess.updateProcess(processImpl);
}
過程是ProcessEntityWrapper -object和processImpl是過程對象
我不知道,爲什麼特定的代碼拋出的ClassCastException異常。有人可以幫我嗎?
感謝
編輯
@Override
public void updateProcess(IProcess process) {
TypedQuery<ProcessEntity> q = em.createQuery(WorkflowAccessProperties.SELECT_PROCESSES_BY_ID,ProcessEntity.class);
q.setParameter("id", process.getId());
ProcessEntity entity = (ProcessEntity) q.getSingleResult();
em.getTransaction().begin();
entity.setLastChange(System.currentTimeMillis());
String previousId = null;
if(process.getPreviousNode() != null) {
previousId = process.getPreviousNode().getId();
}
entity.setPreviousNodeId(previousId);
entity.setCurrentNodeId(process.getCurrentNode().getId());
em.getTransaction().commit();
}
'ProcessEntityWrapper'不是'Process'。我不太清楚爲什麼你不明白這一點,除了你需要回到基礎。 – Radiodef 2014-11-02 02:04:26
他們可能共享相同的界面,但這並不意味着如果您願意,您可以在它們之間切換。在轉換之前檢查'process'類型是'Process':'if(process instanceof Process){/ * cast *} /'。 – Tom 2014-11-02 02:05:18
好的......我很抱歉,但我不明白接口的基本知識。我想,如果任何類實現了相同的接口,我將可能將實現投入彼此。我的使用案例:我必須使用jar文件,這些文件設置了相同的接口IProcess(兩個JAR中的相同包的性質)。我在第一個「jar」中設置了特定的值,並在2. jar文件中修改(轉換後)對象。請原諒我的英文不好:) – ruby85 2014-11-02 02:18:01