Java自动将接口转换为子类型[已关闭]

ig9co6j1  于 2023-05-15  发布在  Java
关注(0)|答案(2)|浏览(128)

**关闭。**此题需要debugging details。目前不接受答复。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
19小时前关闭
Improve this question
所以我遇到了一个问题,我已经实现了一个接口的所有4个子类型的方法。但是,当用超类型的变量调用该方法时,它不会让我这样做。我可以显式地使用instanceof来检查一个,但我需要实现一个调用接口的2个示例的函数。
我已经试过分别检查这两个示例并将其转换,但它不起作用。一个解决方案是创建带有16个分支的if-else来检查每个组合,但这并不理想。

public interface FormulaVisitor <Result , AdditionalArg > {
    
    Result visit(Atom formula, AdditionalArg a);
    Result visit(BinaryOperator formula , AdditionalArg a);
    Result visit(Constant formula , AdditionalArg a);
    Result visit(Not formula , AdditionalArg a);

    }
eqfvzcg8

eqfvzcg81#

我假设你有一个Formula接口,它由AtomConstantBinaryOperatorNot实现。
因此,在访问者中创建一个接受Formula的方法,然后委托给其他方法。所以我会这样写:

public interface FormulaVisitor <Result , AdditionalArg> {
    default Result visit(Formula formula, AdditionalArg a) {
        return switch(formula) {
            case Atom atom -> visit(atom, a);
            case Constant constant -> visit(constant, a);
            case BinaryOperator binaryOperator -> visit(binaryOperator, a);
            case Not not -> visit(not, a);
            default -> null; // if your Formula interface is sealed to 4 classes, this line is not needed
        }
    }

    Result visit(Atom formula, AdditionalArg a);
    Result visit(BinaryOperator formula, AdditionalArg a);
    Result visit(Constant formula, AdditionalArg a);
    Result visit(Not formula, AdditionalArg a);
}

如果你的接口只有这4个实现,那么就把它设为sealed
因为它是接口中的默认方法,所以不必在子类中重新实现它。
在Java中,方法调用在编译时被绑定,因此子类型在编译时无法识别。

ccrfmcuu

ccrfmcuu2#

如果你指的是AtomBinaryOperator等有一个公共的超类型,你只知道公共的超类型:你运气不好-你不能简单地调用这4个方法并希望得到最好的结果:
被调用的确切函数是在编译时静态确定的。
如果你打算实现完整的Visitor pattern,你需要让这4种类型实现对一个适当的访问方法的调用,例如。通过公共超类型声明accept(Visitor visitor),并在每个子类型中实现适当的调用。

相关问题