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

我有一个字符串,告诉我要将对象强制转换为什么,是否有方法强制转换为该对象?

下面是一些伪代码,它们定义了我想做什么


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
  ...
 }
}

尽管有几个人提到这可能是我考虑的方式错误,包括我已将答案标记为正确的答案(即使我提出了错误的问题,也回答了我的问题),我实际上理解这的原因是删除的回复中。

Yushujun 回答:有没有一种方法可以通过使用字符串转换为类型

如评论中所述,您可以通过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);
   ...
  }
}

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

本文链接:https://www.f2er.com/3166406.html

大家都在问