【发布时间】:2020-09-12 18:45:48
【问题描述】:
public enum E{
E1,E2,E3
}
public class Service{
...
}
public interface A<RET>{
RET get();
}
public interface AI<RET,CONF> extends A<RET>{
void conf(CONF ...args);
}
public class AC implements AI<Service,E>{
public void conf(E ...args){
....
}
public Service get(){
return new Service();
}
}
现在,当我尝试使用反射创建“AC”类实例时,出现错误:
public Class MyReflectionAPI{
public Object getInstance(){
Class <? extends AI> aClass = (Class <? extends AI>) Class.forName("AC");
Constructor<? extends AI> aCon = aClass.getConstructor(null);
AI ai = aCon.newInstance((Object[]) null);
Class<?> typeArg = Class.forName("[L"+"E"+";");
Method valueOfTypeArg = typeArg.getMethod("valueOf", String.class);
Object obj[] = new Object[]{valueOfTypeArg.invoke(typeArg,"E1")};
ai.conf(obj);
}
}
给我错误: 线程“main”中的异常 java.lang.ClassCastException: [Ljava.lang.Object;不能转换为 [E;
有没有什么方法可以获取一个带有泛型对象的 AC 类实例的对象?
【问题讨论】:
-
嘿!不确定
"[L"+"E"+";"应该是什么类。你能解释一下吗? -
这里“[L”和“;”添加到读取类型“E”的数组类型类,这里 E 是 Enum,正如您在具有值 enum E {E1,E2,E3} 的问题中看到的
-
您的代码甚至无法编译;众所周知,你写的是
Class而不是class。然后,您在数组上调用valueOf方法的尝试已经失败,因此您永远不会到达代码会产生ClassCastException的地步。您应该提供一个minimal reproducible example,而不是从未见过编译器的伪代码。 -
@Holger 感谢您的纠正,我已更新。实际上我不能发布实际的代码,所以需要创建它的演示版本。对此我深表歉意。
标签: java class methods reflection