2014-11-02 2 views
-1

У меня есть 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(); 

} 
+1

'ProcessEntityWrapper' не является« процессом ». Я не совсем уверен, почему вы не понимаете этого, за исключением того, что вам нужно вернуться к основам. – Radiodef

+0

Они могут использовать один и тот же интерфейс, но это не значит, что вы можете переключаться между ними, если хотите. Убедитесь, что 'process' имеет тип' Process' перед его литьем: 'if (process instanceof Process) {/ * cast *} /'. – Tom

+0

ОК ... извините, но я не понимаю основы интерфейсов. i yougt, если какие-либо классы реализуют одни и те же интерфейсы, я бы смог реализовать реализации друг с другом. Мой прецедент: у меня есть файлы jar, которые устанавливают один и тот же интерфейс IProcess (который находится в том же самом пакете в обоих JAR). Я устанавливаю определенные значения в первом «банке» и изменяю (после заливки) объект в файле 2. jar. Извините, мой плохой английский :) – ruby85

ответ

2

Хотя ProcessEntityWrapper и Process реализует тот же интерфейс, что они не проходят от друг друга.

Это разные классы, реализующие один и тот же интерфейс.

Любой класс может реализовать интерфейс. Это не означает, что они могут быть преобразованы в eachother.

Пример: корова и птица могут реализовать один и тот же интерфейс, но вы не можете превратить корову в птицу только потому, что они реализуют один и тот же интерфейс.

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

+0

Можете ли вы отправить код метода dataAccess.updateProcess()? –

+0

Пожалуйста, посмотрите мое стартовое сообщение – ruby85