Java反射强制转换问题



我想知道你是否能看到我的代码有什么问题。

首先我有这个类

package de.daisi.async.infrastructure.component.event;
import static de.daisi.async.infrastructure.component.event.CType.*;
public class TemperatureEvent implements IEvent {
private static final long serialVersionUID = 1L;
private CType cType = ONEP_ONEC;
public String toString(){
    return "TemperatureEvent";
}

public CType getcType() {
    return cType;
}
}

通过java反射我想获得CType值(ONEP_ONEC)

package de.daisi.async.infrastructure.comunicationtype;
import de.daisi.async.infrastructure.component.event.*;
import java.lang.reflect.Method;
public class CheckComType {
public CType checkType(Class<? extends IEvent> eventClass) {
    System.out.println("Check communcationType: " + eventClass);
    CType cType = null;
    try {
        System.out.println("---In Try---");
        Class cls = (Class) eventClass;
        System.out.println("cls: " + cls);
        Method method = cls.getDeclaredMethod("getcType");
        System.out.println("method: " + method);
        Object instance = cls.newInstance();
        cType = (CType) method.invoke(instance);
        System.out.println("instance: " + instance);
        System.out.println("cType: " + cType);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return cType;
}
public static void main(String... args){
    CheckComType type = new CheckComType();
    CType testType = type.checkType(TemperatureEvent.class);
    System.out.println("testType: " + testType);
}

}

testType结果是空的,我得到一个ClassCastException

java.lang.ClassCastException:de. daisy .async.infrastructure.component.event. ctype不能被强制转换为de.daisi.async.infrastructure.comunicationtype.CType在de.daisi.async.infrastructure.comunicationtype.CheckComType.checkType在de.daisi.async.infrastructure.comunicationtype.CheckComType.main

有什么建议吗?提前谢谢大家

您显然有两个不同的CType类,一个在de.daisi.async.infrastructure.component.event包中,另一个在de.daisi.async.infrastructure.comunicationtype包中。由于您没有在CheckComType中显式引用de.daisi.async.infrastructure.component.event.CType,因此使用来自同一包(即de.daisi.async.infrastructure.comunicationtype.CType)的类。

在Java中,完整的类名才是重要的。包本质上是名称空间,属于不同包的类是不同的类,即使它们的名称相同。

de.daisi.async.infrastructure.component.event.CType cType = null;
try {
    //...
    cType = (de.daisi.async.infrastructure.component.event.CType) method.invoke(instance);
}

等等

或者如果你不打算在同一个类中使用两个CType,则在CheckComType中显式地使用import de.daisi.async.infrastructure.component.event.CType

相关内容

  • 没有找到相关文章

最新更新