2014-11-02 57 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

相關問題