使用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
。
我的搜索通过这个埃菲尔示例带我到wikipedia page about type conversion:
class STRING_8
…
create
make_from_cil
…
convert
make_from_cil ({SYSTEM_STRING})
to_cil: {SYSTEM_STRING}
…
如果STRING_8用作SYSTEM_STRING,则会自动调用convert
之后的方法,反之亦然。
在某种程度上令我感到惊讶的是,我找不到任何支持此语言的语言。
所以我的问题是:还有其他支持此功能的语言吗? 如果没有,有什么理由,因为它对我来说似乎很有用吗? 此外,我认为将其作为语言插件实现并不困难。
答案 0 :(得分:1)
有一个小问题可能使事情变得复杂一些。目前,Eiffel有一个规则,即只有当重新附加源附加到对象时才能应用转换,即不是 Void (在Java / C#中不是 null )
让我们看一下原始的例子:
something (str);
假设 str null 。我们得到 NullPointerException / InvalidArgumentException ,因为代码被转换为
something (fooFrom (str));
和 fooFrom 不期望 null ?或者编译器足够聪明,可以将其转换为
if (str == null)
something (null);
else
something (fooFrom (str));
当前的Eiffel标准确保不会发生此类问题,并且如果涉及转换, str 不是 null 。然而,Java或C#等许多其他语言并不能保证这一点,并且额外的复杂性可能不值得为它们付出努力。
答案 1 :(得分:0)
我相信Eiffel并不是支持转换例程的唯一语言,但我想说它可能是为数不多的将语言定义的其余部分很好地集成的语言之一。
例如,在.NET中,您同时拥有op_Explicit和op_Implicit例程,可用于转换支持它们的语言。而且我相信C#会这样做。
马努
答案 2 :(得分:0)
Type coercion(隐式转换)是一种诅咒和祝福 - 在某些情况下很方便,但它也可能适得其反。
例如,Javascript有许多奇怪的强制规则,当强制字符串编号等时可能导致错误。
Scala 有一些名为"隐含"它实现了与你在埃菲尔所描述的相似的东西(至少对我而言)。毫不奇怪,他们可以导致某些gotchas。但它们也非常方便,例如参见文章Pimp My Library。
答案 3 :(得分:0)