У меня есть 2 класса, которые реализуют тот же интерфейс, что и IProcess.2 Классы реализуют тот же интерфейс -> Throw 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 -объект и processImpl является Процесс Объект
Я не знаю, почему конкретный код бросает ClassCastException. Кто-нибудь может мне помочь, пожалуйста?
Благодаря
EDIT
@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' не является« процессом ». Я не совсем уверен, почему вы не понимаете этого, за исключением того, что вам нужно вернуться к основам. – Radiodef
Они могут использовать один и тот же интерфейс, но это не значит, что вы можете переключаться между ними, если хотите. Убедитесь, что 'process' имеет тип' Process' перед его литьем: 'if (process instanceof Process) {/ * cast *} /'. – Tom
ОК ... извините, но я не понимаю основы интерфейсов. i yougt, если какие-либо классы реализуют одни и те же интерфейсы, я бы смог реализовать реализации друг с другом. Мой прецедент: у меня есть файлы jar, которые устанавливают один и тот же интерфейс IProcess (который находится в том же самом пакете в обоих JAR). Я устанавливаю определенные значения в первом «банке» и изменяю (после заливки) объект в файле 2. jar. Извините, мой плохой английский :) – ruby85