なぜ「メソッドのオーバーロードを避ける」のか?
2023-07-29 23:42:52
疑問点
なぜ Jorge Ortiz はメソッドのオーバーロードを避けるように助言していますか?
どのように解決するには?
オーバーロードをすると、メソッドを関数に持ち上げるのが少し難しくなります。
object A {
def foo(a: Int) = 0
def foo(b: Boolean) = 0
def foo(a: Int, b: Int) = 0
val function = foo _ // fails, must use = foo(_, _) or (a: Int) => foo(a)
}
オーバーロードされたメソッドのセットから1つを選択的にインポートすることはできません。
引数をパラメータ型に適応させるために暗黙のビューを適用しようとすると、あいまいさが生じる可能性が高くなります。
scala> implicit def S2B(s: String) = !s.isEmpty
S2B: (s: String)Boolean
scala> implicit def S2I(s: String) = s.length
S2I: (s: String)Int
scala> object test { def foo(a: Int) = 0; def foo(b: Boolean) = 1; foo("") }
<console>:15: error: ambiguous reference to overloaded definition,
both method foo in object test of type (b: Boolean)Int
and method foo in object test of type (a: Int)Int
match argument types (java.lang.String)
object test { def foo(a: Int) = 0; def foo(b: Boolean) = 1; foo("") }
デフォルトのパラメータを静かに使用不能にすることができます。
object test {
def foo(a: Int) = 0;
def foo(a: Int, b: Int = 0) = 1
}
個々には、これらの理由はオーバーロードを完全に敬遠することを強制するものではありません。何か大きな問題を見逃しているような気がします。
アップデイト
証拠は積み重なっている。
- を複雑にしています。 スペック
- それは インプリシットを不適当なものにする を表示することができます。
- オーバーロードされた選択肢のうち1つだけについて、パラメータのデフォルトを導入することを制限しています。
- 引数は期待された型なしに型付けされるので、無名関数リテラルのような '_.foo' のような無名関数リテラルをオーバーロードされたメソッドへの引数として渡すことはできません。 .
アップデイト2
- パッケージオブジェクトでオーバーロードされたメソッドを使用することは (現在のところ) できません。
- 適用可能なエラーは 診断が難しい になります。
アップデイト3
- 静的なオーバーロードの解決は、すべての型安全性のAPIを奪うことができます。
scala> object O { def apply[T](ts: T*) = (); def apply(f: (String => Int)) = () }
defined object O
scala> O((i: String) => f(i)) // oops, I meant to call the second overload but someone changed the return type of `f` when I wasn't looking...
関連
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] ポリモーフィズム vs オーバーライド vs オーバーローディング
-
[解決済み】戻り値型による関数のオーバーロード?
-
[解決済み] ScalaのManifestとは何か、いつ必要なのか?
-
[解決済み] Objective-Cのメソッドオーバーローディング?
-
[解決済み] scalaの列挙を理解する
-
[解決済み] リスト[Option]からNoneを除外するには?
-
[解決済み] Scala における => と () => の意味 [重複].
-
[解決済み] Scala。文字列からブール値へのエレガントな変換
-
[解決済み] scalaで空リストを宣言し、文字列を追加するには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Scala コンパイラは、なぜデフォルトの引数を持つオーバーロードされたメソッドを許可しないのですか?
-
[解決済み] Scalaの配列の初期化
-
[解決済み] Scalaにおけるval-mutableとvar-immutableの比較
-
[解決済み] Scalaでマップを反転させるエレガントな方法
-
[解決済み] Scala の "new" キーワード
-
[解決済み] sbtのヒープサイズを設定するには?
-
[解決済み] Mapにkeyやvalueが存在するかどうかを確認するには?
-
[解決済み] Scala Mapのキーと値の両方をマッピングする
-
[解決済み] Scalaで関数を定義する3つの方法の違い
-
[解決済み] scalaで空リストを宣言し、文字列を追加するには?