将实例强制转换为实际类型

时间:2015-07-23 03:39:27

标签: java class casting

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

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返回一块石头,我需要将其转换为真实类型,以便我可以使用唯一

2 个答案:

答案 0 :(得分:1)

我假设您的示例DogCatAnimal类的孩子。

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

您可以使用泛型将任何children Animal个对象投射到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方法仅接受children类的Animal作为参数,以便您可以避免instanceof检查。

答案 1 :(得分:0)

如果您打算将它用于诸如

之类的东西,您只需将其强制转换为真实类型
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 ....

注意:您需要知道您可能感兴趣的所有类型,至少是广义的。