为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法使用字符串来转换为类型

有没有办法使用字符串来转换为类型

慕运维8079593 2024-01-28 20:24:17
我有一个字符串告诉我要将对象转换为什么,有没有办法转换为该对象?这是一些伪代码,定义了我想要做的事情public TypeToCastTo Cast(T object, String TypeToCastTo) {  switch (TypeToCastTo) {   case "foo":     return (foo)T;   case "otherType":     return (otherType)T;   ...  }}编辑我想创建一个游戏,我可以单击一个按钮来购买一些东西,例如继承自 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  ... }}尽管有几个人提到我的想法可能是错误的,包括我标记为正确的答案(尽管我问了错误的问题,但它回答了我的问题),我真正理解这一点的原因是因为一个回复那个被删除了。
查看完整描述

2 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

正如评论中提到的,您可以通过使用反射和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);

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


查看完整回答
反对 回复 2024-01-28
?
杨魅力

TA贡献1811条经验 获得超5个赞

替代方法(虽然我不知道这是否被认为是不好的做法):


public TypeToCastTo Cast(T object, String TypeToCastTo) {

  switch (TypeToCastTo) {

   case "foo":

     return new Foo(object);

   case "otherType":

     return new OtherType(object);

   ...

  }

}

对于您想要处理的不同类型,您将需要带有相应参数(重载)的特定构造函数。在这些构造函数中,您可以控制从一种类型到另一种类型的精确“翻译”。


查看完整回答
反对 回复 2024-01-28
  • 2 回答
  • 0 关注
  • 35 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信