使用通用类共享类型吗?

问题描述 投票:0回答:2

如何将变量声明为与用于实例化泛型类的类型参数相同的类型?以下代码无法编译:

class
    TEST [G, H -> INTEGER]

feature

    f (i: INDEXABLE [G, H])
        local
            y: H
        do
            y := i.lower -- Type error here.
        end

end

编译器说,分配源与目标不兼容

generic-programming eiffel
2个回答
1
投票

在当前实现中,INDEXABLE [G, H]继承自TABLE [G, INTEGER]。结果,lower的类型为INTEGER,而不是H。并且INTEGER不符合类H的形式通用类型TEST。这说明了错误。

对我来说,在类INDEXABLE的声明中似乎是一个错误。它应该从TABLE [G, H]继承。然后,示例代码将编译。


0
投票

在这些情况下可以使用类型锚:

feature
    f (i: INDEXABLE [G, H])
        local
            y: like i.lower
        do
            y := i.lower
        end

有时不将通用类型用作类上任何可访问功能的返回类型,因此在那些情况下,我想声明一个专门用于允许锚定的伪功能:

class SOME_CLASS [G]
feature
    generic_type_anchor: G
        do
            check
                for_anchoring_only: False
                -- This method should never actually be called, only used as an anchor in type declarations
            end
        end

这对于复杂的继承树或后代类关闭泛型时特别有用,在这种情况下,从声明的类型中看不到正确的类型。就个人而言,我倾向于在值与语义相关时使用类型锚定,因为这有助于表达意图,简化重构(因为根据定义必须匹配的类型重复次数较少)并有助于协方差。

也作为旁注,扩展类型(如INTEGER)不能多态使用(您需要一个引用;如果类A被扩展,而类B [已扩展或引用]继承了A,则您无法分配将类型B的值转换为类型A的变量;从扩展类型的继承隐式不符合规范),此外,编译器不允许从基本扩展类型(INTEGERBOOLEANREAL_64等)继承您的示例中的通用约束没有任何意义,因为H永远不能是INTEGER

© www.soinside.com 2019 - 2024. All rights reserved.