当此实例可能具有不同的数据类型时,如何返回实例的正确数据类型?

时间:2016-03-17 19:51:45

标签: java function types instance

我在Modula-2中有这段代码,

sapply(l, "length<-", max(lengths(l)))

当我尝试将此代码转换为java时,我遇到了一些问题。我可以创建一个实例并判断它的实例是否为null,然后选择要返回的内容。但我真的不知道如何处理案例2,实例可能是一个新的Opentype();因为在这种情况下只能返回一个值。

PROCEDURE Prune(typeExp: TypeExp): TypeExp;
    BEGIN
        CASE typeExp.^class OF
            | VarType:
                IF typeExp^.instance = NIL THEN
                    RETURN typeExp;
                ELSE
                    typeExp^.instance = Prune(typeExp^.instance);
                    RETURN typeExp^.instance;
                END;
            | OperType: RETURN typeExp;
            END;
END Prune;

第二个问题是我不认为我可以在其内部调用Prune()函数,所以我该怎么办?提前谢谢。

2 个答案:

答案 0 :(得分:2)

我真的不知道Modula-2,但它可能是这样的:

public TypeExp Prune(TypeExp typeExp) {
    if (typeExp instanceof VarType) {
        if (typeExp.instance == null) {
            return typeExp;
        }
        else {
            typeExp.instance = Prune(typeExp.instance);
            return typeExp.instance;
        }
    } else if (typeExp instanceof OperType) {
        return typeExp;
    }
    //if typeExp is not an instance of VarType or OperType
    return null;
}

Modula代码不会在所有代码路径中返回。这在Java中是不可能的。我在这些情况下插入了返回null。这可能是你的应用程序错误。

答案 1 :(得分:0)

以下示例与您的func不同,但我认为您可以根据自己的需要进行修改。它隐藏了Type class =&gt;背后的返回类型。你可以返回两个类的对象。

主要

package com.type;

public class Main {
    public static void main(String[] args) {
        Type first = new FirstType();
        Type second = new SecondType();

        System.out.println(func(first).getTypeName());
        System.out.println(func(first).getTypeName());
        System.out.println(func(second).getTypeName());
    }

    public static Type func(Type type) {
        if(type instanceof FirstType) {
            type.setTypeName("First");
        } else {
            type.setTypeName("Second");
            // something here
        }
        return type;
    }
}

类型

package com.type;

public class Type {
    private String typeName;

    public Type() {}

    public String getTypeName() {
        return typeName;
    }

    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }
}

FirstType

package com.type;

public class FirstType extends Type {
}

SecondType

package com.type;

public class SecondType extends Type {
}