2014-11-02 58 views
-1

我有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(); 

} 
+1

'ProcessEntityWrapper'不是'Process'。我不太清楚为什么你不明白这一点,除了你需要回到基础。 – Radiodef 2014-11-02 02:04:26

+0

他们可能共享相同的界面,但这并不意味着如果您愿意,您可以在它们之间切换。在转换之前检查'process'类型是'Process':'if(process instanceof Process){/ * cast *} /'。 – Tom 2014-11-02 02:05:18

+0

好的......我很抱歉,但我不明白接口的基本知识。我想,如果任何类实现了相同的接口,我将可能将实现投入彼此。我的使用案例:我必须使用jar文件,这些文件设置了相同的接口IProcess(两个JAR中的相同包的性质)。我在第一个“jar”中设置了特定的值,并在2. jar文件中修改(转换后)对象。请原谅我的英文不好:) – ruby85 2014-11-02 02:18:01

回答

2

虽然ProcessEntityWrapperProcess实现他们不互相扩展同一接口。

它们是不同的类,只是实现相同的接口。

任何类都可以实现一个接口。这并不意味着他们可以转换为彼此。

示例:一头母牛和一只鸟可以实现相同的接口,但不能仅仅因为它们实现相同的接口而将母牛转换为鸟。

public interface Speakable(){ 
    public String speak(); 
} 

public class Cow implements Speakable(){ 
    public String speak(){ 
     return "moooo"; 
    } 
} 

public class Bird implements Speakable(){ 
    public String speak(){ 
     return "vik vik"; 
    } 
} 
+0

感谢您回答我的问题。我理解你的榜样。但是,我如何解决我的问题?我会在两个不知道彼此的jar文件之间进行通信。我想,如果每个jar文件实现相同的接口,我可以相互沟通... – ruby85 2014-11-02 02:26:04

+0

你可以发布dataAccess.updateProcess()方法的代码? – 2014-11-02 02:41:28

+0

请看我的开始帖子 – ruby85 2014-11-02 03:26:37

相关问题