2

我在用 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));
}

但后来我想到了一种“自动类型转换”的可能性,它只使用我定义的转换函数fooFrom,每次传入一个字符串,其中一个 Foo 对象除外。

我的搜索把我带到了关于类型转换的维基百科页面,这个 Eiffel 示例:

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

convert如果将 STRING_8 用作 SYSTEM_STRING,则会自动调用后面的方法,反之亦然。令我惊讶的是,我找不到任何其他语言支持这一点。

所以我的问题是:还有其他语言支持这个功能吗?如果没有,是否有任何理由,因为它对我来说似乎很有用?此外,我认为将其作为语言插件实现并不难。

4

4 回答 4

1

有一点可能会使事情变得更复杂一些。目前,Eiffel 有一条规则,即只有在重新附加的源附加到对象时才能应用转换,即不是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不为空。然而,许多其他语言(如 Java 或 C#)并不能保证这一点,而且额外的复杂性可能不值得他们付出努力。

于 2012-11-06T09:30:54.513 回答
0

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

例如,在 .NET 中,您有 op_Explicit 和 op_Implicit 例程,可用于转换支持它们的语言。我相信 C# 确实如此。

马努

于 2012-11-06T05:47:30.927 回答
0

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

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

Scala有一种叫做“隐式”的东西,它实现了与您在 Eiffel 中描述的类似(至少对我而言)的东西。毫不奇怪,它们可能会导致某些问题。但它们也可以非常方便,例如见文章Pimp My Library

于 2012-11-06T13:35:36.563 回答
0

C++ 有复制构造函数和赋值运算符

于 2012-11-09T12:58:49.180 回答