[解決済み] Scala コンパイラは、なぜデフォルトの引数を持つオーバーロードされたメソッドを許可しないのですか?
2022-05-06 01:44:21
質問
このようなメソッドのオーバーロードが曖昧になる正当なケースもあるかもしれませんが、コンパイル時や実行時に曖昧でないコードをコンパイラが許可しないのはなぜですか?
例
// This fails:
def foo(a: String)(b: Int = 42) = a + b
def foo(a: Int) (b: Int = 42) = a + b
// This fails, too. Even if there is no position in the argument list,
// where the types are the same.
def foo(a: Int) (b: Int = 42) = a + b
def foo(a: String)(b: String = "Foo") = a + b
// This is OK:
def foo(a: String)(b: Int) = a + b
def foo(a: Int) (b: Int = 42) = a + b
// Even this is OK.
def foo(a: Int)(b: Int) = a + b
def foo(a: Int)(b: String = "Foo") = a + b
val bar = foo(42)_ // This complains obviously ...
この制限をもう少し緩めることはできないのでしょうか?
特に、オーバーロードの激しいJavaコードをScalaに変換する場合、デフォルトの引数は非常に重要で、たくさんのJavaメソッドを1つのScalaメソッドに置き換えた後に、仕様やコンパイラが任意の制限を課していることに気づくのは良いことではないでしょう。
どうすればいい?
Lukas Rytzを引用したいと思います(from こちら ):
の決定論的な名前付けスキームが欲しかったからです。 はデフォルトの引数を返すメソッドを生成します。もし
def f(a: Int = 1)
コンパイラが生成する
def f$default$1 = 1
同じパラメータにデフォルトで2つのオーバーロードがある場合 の位置にある場合、異なる命名規則が必要になります。しかし、私たちは は、複数のコンパイラが実行されても、生成されるバイトコードは安定しています。
将来のScalaバージョンでの解決策としては 型名 を名前付けのスキーマに組み込んでいます。
def foo(a: String)(b: Int = 42) = a + b
def foo(a: Int) (b: Int = 42) = a + b
のようなものでしょう。
def foo$String$default$2 = 42
def foo$Int$default$2 = 42
喜んでくれる人 SIPプロポーザルを作成する ?
関連
-
[解決済み] Scala forallの例?
-
[解決済み] Scalaでループから抜け出すにはどうしたらいいですか?
-
[解決済み] GSON JsonObject "Unsupported Operation Exception: null" getAsString
-
[解決済み] Scalaで定数メンバを定義するには?
-
[解決済み] Scalaの「コンテキストバウンド」とは何ですか?
-
[解決済み】関数を定義する "def "と "val "の違いとは?
-
[解決済み] マクロから匿名クラスのメソッドを持つ構造型を取得する
-
[解決済み] Scalaは、コレクションをMap-by-keyに変換する最良の方法ですか?
-
[解決済み] Spark SQLでカラムの降順でソートするには?
-
[解決済み] Scala:1ステートメントで文字列をファイルに書き込む
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Sparkです。CoarseGrainedSchedulerが見つかりませんでした。
-
[解決済み] Scalaの変数の表示形式
-
[解決済み] TimeoutExceptionが発生した場合、どのような原因が考えられるでしょうか。Sparkで作業しているときに[n秒]後にFuturesがタイムアウトしました[重複]。
-
[解決済み] Scalaのリターン
-
[解決済み】Scalaの型消去を回避するにはどうしたらいいですか?または、なぜ私のコレクションの型パラメータを取得することができないのですか?
-
[解決済み】Scalaのvarとvalの定義の違いは何ですか?
-
[解決済み】Scala 2.8 breakOut
-
[解決済み】Scala 2.8における<:<、<%<、=:=の意味と、それらのドキュメントはどこにあるのか?
-
[解決済み] マクロから匿名クラスのメソッドを持つ構造型を取得する
-
[解決済み] Spark SQLでカラムの降順でソートするには?