【问题标题】:Diamond Issue with Groovy traitsGroovy 特征的钻石问题
【发布时间】:2018-04-04 23:18:06
【问题描述】:

在许多关于 Groovy Traits 的博客中都提到它将解决钻石问题。但是我不清楚特征将如何解决钻石问题。

谁能解释一下。

【问题讨论】:

    标签: groovy traits


    【解决方案1】:

    diamond problem 是一个问题,当您有多重继承并且两个或多个超类定义一个或多个具有相同签名的函数时。

    使用 groovy 特征,行为是明确定义的。默认情况下,选择最后一个实现。

    trait A {
        String name() { "A" }
    }
    trait B {
        String name() { "B" }
    }
    class C implements A,B { }
    class D implements B,A { }
    
    assert new C().name() == "B"
    assert new D().name() == "A"
    

    也可以选择你想要的:

    class E implements A,B {
        String name() { A.super.name() + B.super.name() }
    }
    
    assert new E().name() == "AB"
    

    【讨论】:

    • 这个处理方式是否与 Java 8 相同。
    • trait 是否以与 Java 8 相同的方式解决了菱形问题。你能确认一下吗?
    • @Souvik 简短的回答是否定的,当您遇到接口中默认实现的菱形问题时,java 8 会以不同的方式解决这个问题。例如,请参阅 this blog post,了解 java 8 中的冲突解决规则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多