【问题标题】:Cast an instance to its real type将实例转换为其真实类型
【发布时间】:2023-04-10 09:24:02
【问题描述】:

我有一个调用其他几个方法的方法,这些方法有不同的返回类型,就像:

public void caller() {
    String methodName = "call2";
    Method[] methods = Called.class.getDeclaredMethods();
    for (Method method : methods) {
        if (method.getName().equals(methodName)) {
            Object obj = method.invoke(null, null);
            // then I want to cast obj to its real type, in called class the 
            // method may return a List or Map an so on
        }
    }
}

例如方法a返回植物,方法b返回动物,方法c返回石头,我需要将其转换为真实类型,这样我才能使用唯一性

【问题讨论】:

  • 那有什么问题呢?
  • “将其转换为真实类型”是什么意思?它已经是它真正的类型了。如果你知道它的类型,你可以用(List<Whatever>) 之类的来投射它;如果你不这样做,那么无论如何你也无能为力。
  • 您没有使用getDeclaredMethod(...)的任何特殊原因?
  • 界面适合你吗?
  • @AnandSKumar 我想将它转换为它的真实类而不是声明类,就像 Animal animal = new Dog() 我声明了一个动物但它确实是一只狗,所以我可以在 DOG 中使用方法而不是在 Animal 中如果我使用 instanceof 如果有很多动物狗猫猴子等等我应该如果...否则很多我想要一种自动投射的方式

标签: java class casting


【解决方案1】:

我假设从你的例子中,DogCatAnimal 类的孩子。

class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}

您可以使用泛型将任何childrenAnimal 对象转换为Animal

public <T extends Animal> Animal castToAnimal(T childAnimal) {
    Animal animal = null;
    if (childAnimal != null) {
        animal = Animal.class.cast(childAnimal);
        // Or use
        // animal = (Animal) childAnimal;
    }
    return animal;
}

定义castToAnimal方法只接受Animal类的children作为参数,这样就可以避免instanceof检查。

【讨论】:

  • 我表达不清楚的问题很酷,但是你的评论启发了我 tkx
  • 请注意这个演员表是一个检查。引用以 Animal 开始,以 Animal 类型结束。即,如果它是动物,它什么也不做。
【解决方案2】:

如果你打算将它用于诸如此类的东西,你只需要将它转换为它的真实类型

if (obj instanceof Map) {
    Map map = (Map) obj;
    System.out.println("Size: "+map.size();

} else if (obj instanceof Collection) {
    Collection coll = (Collection) obj;
    System.out.println("Size: " + coll.size();

} else if ....

注意:您需要了解您可能感兴趣的所有类型,至少大致了解。

【讨论】:

  • 对不起,那是我的错,我知道这种方式,但我想要一种方法来制作可扩展的方式来做到这一点
  • @Wangbo 你能举个例子说明你想在投射后对这个对象做什么,而没有它你不能做吗?
  • 对象是超类,它确实不是t have List or Map or any other extends class method I need to use it your answer is regular way to cast an instance , but i want a way to cast it automatic just like &lt;code&gt;Animal animal = new Dog()&lt;/code&gt; I declare an Animal but its 狗,所以我可以在 DOG 中声明方法而不是在 Animal 中声明
  • 也许此评论不正确,请参阅此问题的文本以获取更多详细信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多