我不知道有什么语言可以做到这一点……遗憾的是,我很想玩弄它(但首先,他们应该采用类型推断和参数多态性;))。
虽然它是可能的:在结构类型系统中相对优雅(如果 a 拥有 b 所拥有的一切,则类型 a 是类型 b 的子类型),只需为 value 指定一个类型,它是BigInteger
and ofDouble
和 of的结构子类型,Nil
稍微不那么优雅在主格类型系统中(类型 a 是类型 b 的子类型当且仅当它直接或间接地从它继承)通过指定所有三个的共同祖先(如果所有其他方法都失败,object
)。当然我们需要递归——toString 的类型是什么?什么是类型(Integer | Double | BigInteger).+
?!?这远非微不足道(事实上,寻找解决方案让我有点头疼)。我不能说这是否不可能,但没有任何主要面向对象语言的类型系统在任何地方都足够复杂以提供可能的解决方案。
底线是:如果有高手来解决它提出的问题,那就太酷了。可能不值得努力...
编辑:你知道代数数据类型吗?它们与您的想法相似(但要旧得多;)),因为代数数据类型由多种类型组成,因此可以包含例如 BigInteger、Double 和 Nil - 实际值是其中之一和标签(如标记的 union ) 说的是哪个。但是要使用存储在代数数据类型中的值,您必须使用模式匹配来安全地提取它。这个概念非常强大,并且仍然“简单”到足以被理解的工具——例如类型推断和静态类型检查工作。