有没有一种方法可以通过使用字符串强制转换为类型



我有一个字符串,它告诉我想将对象强制转换为什么,有办法强制转换为那个对象吗?

这里有一些伪代码,定义了我想做什么


public TypeToCastTo Cast(T object, String TypeToCastTo) {
switch (TypeToCastTo) {
case "foo":
return (foo)T;
case "otherType":
return (otherType)T;
...
}
}

edit
我想创建一个游戏,点击按钮购买从worldObject继承的剑或盔甲。我想,因为我可能会返回一个武器或盔甲类(它们都继承自worldObject(,所以返回一个worldObject,然后向下转换到正确的类(基于它的名称(字符串((是有意义的。

编辑2:正如评论中提到的,这是一个XY问题。我最初试图创建一个返回下转换类型的函数,但事实上这没有意义,因为在其他地方使用它的情况下,我需要一个switch语句来确定如何处理对象(此时我可以进行转换(,而不是使用

public TypeToCastTo Cast(T object, String TypeToCastTo) {
switch (TypeToCastTo) {
case "foo":
return (foo)T;
...
}
}

使用我的函数来投射WorldObject,我可以拥有

Method DoingSomethingWithWorldObject(WorldObject T) {
switch(T.typeToCastTo) {
case "foo":
foo temp = (foo)T;
// code using temp
case "other":
other temp = (other)T;
// code using temp
...
}
}

尽管有几个人提到我的想法可能是错误的,包括我标记为正确的答案(即使我问错了问题,它也回答了我的问题(,但我真正理解这一点的原因是因为一个被删除的回复。

如注释中所述,您可以通过使用Class.cast方法的反射来实现这一点:

public Object cast(Object object, String typeToCastTo) {
switch (typeToCastTo) {
case "foo":
return Foo.class.cast(object);
case "otherType":
return OtherType.class.cast(object);
}
}

但是,该方法的返回类型需要是Object,因为您不知道typeToCastTo参数中编码的实际返回类型。

也就是说,如果你手头有一个Class的实例:,它至少有一些意义

Class<Foo> fooClass = (Class<Foo>) Thread.currentThread().getContextClassLoader().loadClass("my.foo.Foo");
Foo fooObject = foo.cast(object);

但所有这些似乎都毫无意义。。。

根据评论。要调用父类的私有方法,不需要强制转换:

Object object = new SubFoo();
Method privateFooMethod = Arrays.asList(ParentFoo.class.getDeclaredMethods())
.stream().filter(m -> m.getName().equals("privateFooMethod")).findAny()
.get();
privateFooMethod.setAccessible(true);
privateFooMethod.invoke(object);

但是,在使用反射来实现这样的目标之前,你真的应该三思而后行。这看起来很像是一个糟糕的类/接口设计,导致了相当基本的需求的奇怪解决方案。

替代方法(尽管我不知道这是否被认为是糟糕的做法(:

public TypeToCastTo Cast(T object, String TypeToCastTo) {
switch (TypeToCastTo) {
case "foo":
return new Foo(object);
case "otherType":
return new OtherType(object);
...
}
}

不过,对于您想要处理的不同类型,您需要具有相应参数(重载(的特定构造函数。在这些构造函数中,您可以控制从一种类型到另一种类型的精确"转换"。

最新更新