如何将变量声明为与用于实例化泛型类的类型参数相同的类型?以下代码无法编译:
class
TEST [G, H -> INTEGER]
feature
f (i: INDEXABLE [G, H])
local
y: H
do
y := i.lower -- Type error here.
end
end
编译器说,分配源与目标不兼容。
在当前实现中,INDEXABLE [G, H]
继承自TABLE [G, INTEGER]
。结果,lower
的类型为INTEGER
,而不是H
。并且INTEGER
不符合类H
的形式通用类型TEST
。这说明了错误。
对我来说,在类INDEXABLE
的声明中似乎是一个错误。它应该从TABLE [G, H]
继承。然后,示例代码将编译。
在这些情况下可以使用类型锚:
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的变量;从扩展类型的继承隐式不符合规范),此外,编译器不允许从基本扩展类型(INTEGER
,BOOLEAN
,REAL_64
等)继承您的示例中的通用约束没有任何意义,因为H
永远不能是INTEGER
。