我有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