繁体   English   中英

为什么埃菲尔铁塔的自动类型转换功能不受欢迎?

[英]Why isn't Eiffel's automatic type conversion feature more popular?

用Java编程时发生了什么事:

String str

// want to call something(), but signature does not match
something(Foo foo)

// but I have this conversion function
Foo fooFrom(String)

// Obviously I am about to create another method overload.. sigh
something(String s) {
    something(fooFrom(s));
}

但是后来我想到了“自动类型转换”的可能性,它每次都在排除Foo对象的地方传递字符串时仅使用我定义的转换函数fooFrom

我的搜索将我带到这个Eiffel示例的有关类型转换Wikipedia页面

class STRING_8
    …
create
    make_from_cil
    …
convert
    make_from_cil ({SYSTEM_STRING})
    to_cil: {SYSTEM_STRING}
    …

如果将STRING_8用作SYSTEM_STRING,则将自动调用convert后的方法,反之亦然。 某种程度上令我感到惊讶的是,我找不到其他语言来支持此功能。

所以我的问题是:还有其他语言支持此功能吗? 如果没有,那有什么理由,因为这对我来说很有用? 此外,我认为将其实现为语言附加组件并不难。

有一点要点可能会使事情变得更复杂。 目前,埃菲尔有一个规则,即仅当重新附加的源附加到对象(即不是Void (在Java / C#中不是null ))时,才可以应用转换。

让我们看一下原始示例:

something (str);

假设strnull 我们是否获得NullPointerException / InvalidArgumentException ,因为代码已转换为

something (fooFrom (str));

fooFrom不期望为null吗? 还是编译器足够聪明,可以将其转换为

if (str == null)
    something (null);
else
    something (fooFrom (str));

当前的Eiffel标准确保不会发生此类问题,并且如果涉及转换,则str不为null 但是,许多其他语言(例如Java或C#)不保证这样做,因此额外的复杂性可能不值得他们付出。

我相信Eiffel并不是唯一支持转换例程的语言,但是我想说它可能是极少数将其很好地与语言定义的其余部分集成的语言之一。

例如,在.NET中,您同时具有op_Explicit和op_Implicit例程,可用于对支持它们的语言进行转换。 而且我相信C#可以。

马努

类型强制 (隐式转换)是一种诅咒和祝福-在某些情况下很方便,但也会适得其反。

例如,JavaScript有许多奇怪的强制规则,当将字符串强制为数字时,可能会导致错误。

Scala有一种叫做“隐式”的东西,可以达到(至少对我来说)与您在Eiffel中描述的东西类似的东西。 毫不奇怪,它们可以导致某些陷阱 但是它们也可以非常方便,例如参见文章Pimp My Library

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM