我在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()函数,所以我该怎么办?提前谢谢。
答案 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 {
}