String className = "com.package.MyClass";
Class c = Class.forName(className);
Object obj = c.newInstance();
如何将 obj 动态转换为 MyClass 对象?我不能这样写:
MyClass mobj = (MyClass)obj;
...因为 className 可能不同。
答案 0 :(得分:60)
我认为它非常直接的反思
MyClass mobj = MyClass.class.cast(obj);
如果班级名称不同
Object newObj = Class.forName(classname).cast(obj);
答案 1 :(得分:22)
你没有,声明一个声明你想要调用的方法的接口:
public interface MyInterface
{
void doStuff();
}
public class MyClass implements MyInterface
{
public void doStuff()
{
System.Console.Writeln("done!");
}
}
然后你用
MyInterface mobj = (myInterface)obj;
mobj.doStuff();
如果MyClass
不在您的控制之下,那么您无法使其实现某个界面,而另一个选项是依赖于反射(see this tutorial)。
答案 2 :(得分:3)
您不必将对象转换为MyClass对象,因为它已经是。你真正想做的就是抛出它,但由于类名在编译时是不可知的,所以你不能这样做,因为你不能声明该类的变量。我的猜测是你想要/需要类似“duck typing”的东西,即你不知道类名,但你知道编译时的方法名。 Gregory提出的接口是你最好的选择。
答案 3 :(得分:2)
如果您不知道mojb
类型为MyClass
,那么如何创建该变量?
如果我的类是接口类型或超类型,则无需进行转换。
答案 4 :(得分:0)
@SuppressWarnings("unchecked")
private static <T extends Object> T cast(Object obj) {
return (T) obj;
}