7

たとえば、Exception.allCatchは次のように定義されます

def allCatch[T]: Catch[T] 

なぜだけではないのですか

val allCatch: Catch[Nothing]

Catchその議論の共変はいつですか?

PartialFunctionまたは、オブジェクトが定義する理由

def empty[A, B]: PartialFunction[A, B] 

ただの代わりに

val empty: PartialFunction[Any,Nothing]

更新:これまでのところ、答えは要点を見逃しているようです。ですから、実際に質問を対象とする具体的な例を回答に含めてください。def empty[A, B]: PartialFunction[A, B]例:で機能するが機能しない(またはあまり便利ではない)コードを表示しval empty: PartialFunction[Any,Nothing]ます。

4

4 に答える 4

2

PartialFunction available hereのソースを見ると、実際にPartialFunctionオブジェクトのプライベート メソッドを呼び出していることがわかります。

private[this] val empty_pf: PartialFunction[Any, Nothing]

したがって、空の戻り値の型は常に になりますPartialFunction[Any, Nothing]。背後にある理由については、私にはわかりません。他の誰かがその理由についてより良い洞察を持っているかもしれません。言語のメーリング リストも試すことができます...

于 2013-03-10T12:50:27.360 に答える
2

のように型をハードコーディングするとPartialFunction[Any,Nothing]、関数が よりも具体的なパラメータを取るように制限できなくなりますAny

ジェネリック型パラメーターを使用することで、より柔軟にすべてのケースを満たし、特に関数を安全にすることができます。

Animalas パラメーターを受け取り、 を返すことを目的とした関数が必要であると仮定しましょうInteger

function が次のように宣言されていると仮定しましょう:

def myFunction: PartialFunction[Any,Nothing]

まず、PartialFunction はAnimalat パラメータ側ではなく に特化されますAny。パラメータとして渡すとどうHumanなりますか....、それは合格します..安全性はどうですか?

第二に、この関数が return として宣言されている場合Nothing、そこから値を返すことはできませんNothing! 実際、NothingScala のすべてのクラスをサブクラス化します。これは、関数を興味深いものにするために、戻り値の型パラメーターが常に共変でなければならないという既知の規則につながりますNothing

実際、は のメソッドをNothing扱う場合にのみ興味深いものです。定義による空のロジックは、返すものが何もないため、強制的に実行する必要があります:)emptyPartialFunctionPartialFunction

「では、戻り値の型を に変更してみませんAnyか?」回答:コンパイラが必要なキャストを自動的に追加するための一般的な消去時間のすべての利点を失うため=>整数値を直接取得するのではなく、Any. 迷惑..

于 2013-03-10T12:29:46.537 に答える
2

これにより、後でキャストする必要がなくなり、args 型を Any ではなく T として扱うことができます。これは通常より便利です。

次に例を示します。

scala> def func1[T](arg : T) : T = { arg }
func1: [T](arg : T)T

scala> def func2(arg : Any) : Any = { arg }
func2: (arg: Any)Any

scala> func1(4)
res4: Int = 4

scala> func2(4)
res7: Any = 4
于 2013-03-10T11:37:47.347 に答える
1

実際、Scala 標準ライブラリには、ジェネリック型パラメーターが冗長な場所がいくつかあるようです (型の差異のため)。たとえば、 に関する私の質問を参照してくださいforeach。私の推測では、@Peter の回答に基づいて、これらの冗長なジェネリックがインターフェイスをより明確にするということです。それらのおかげで、共変、反変、不変の型を覚える必要がなくなりました。また、これにより、Scala の高度な機能である分散に慣れていない人でも作業が簡単になります。

于 2013-03-10T22:44:42.823 に答える