私は2010年からScalaでプログラミングを行っており(現在は2017年の終わりです)、java.util.Arrays.toString
メソッドがString
sに対してオーバーロードされていないことを知り、今日ショックを受けました。以下はJavaでは期待どおりに機能しますが、Scalaでは機能しません。
Java
public class Main {
public static void main(String[] args) {
System.out.println(java.util.Arrays.toString(args));
}
}
Scala
object Main {
def main(args: Array[String]): Unit = {
println(java.util.Arrays.toString(args))
}
}
私はこれに対する多くの回避策を知っています(したがって、提案する必要はありません)が、そもそもそれは必要ないと思います。これが長年のバグ(または未完成の機能)であるとは想像できません。また、この動作が意図されているとは想像できません。
<console>:12: error: overloaded method value toString with alternatives:
(x$1: Array[Object])String <and>
(x$1: Array[Double])String <and>
(x$1: Array[Float])String <and>
(x$1: Array[Boolean])String <and>
(x$1: Array[Byte])String <and>
(x$1: Array[Char])String <and>
(x$1: Array[Short])String <and>
(x$1: Array[Int])String <and>
(x$1: Array[Long])String
cannot be applied to (Array[String])
誰かがこれが機能しない理由を合理的に説明できますか?生意気なことはしないでください。sのためにオーバーロードされていないようですString
が、Javaには明らかにハックがあり、それを機能させるために、Scalaに何もないのはなぜですか?
この質問を見つけましたが、Javaでも機能しますが、Scalaでは機能しないのはなぜですか?
PS
それは重要ではありませんが、私は得ました:
それが機能するのは実際にはJavaのバグです。候補者のリストを見ると、明らかに適切な代替手段がないことがわかります。Array[Object]
誤ってバリアントを呼び出すことになりますが、それは間違っています。なぜならArray
、その型パラメーターは不変であるため(すべてのジェネリック型は、Javaでは不変です)、のスーパークラスでArray[Object]
はありませんArray[String]
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加