<:<演算子はScalaでどのように機能しますか?

ブライアンゴードン

Scalaに<:<は、型の制約を目撃するクラスがあります。差出人Predef.scala

  sealed abstract class <:<[-From, +To] extends (From => To) with Serializable
  private[this] final val singleton_<:< = new <:<[Any,Any] { def apply(x: Any): Any = x }
  implicit def $conforms[A]: A <:< A = singleton_<:<.asInstanceOf[A <:< A]

それがどのように使用されるかの例は、次のtoMap方法にありTraversableOnceます:

def toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U] =

私が理解していないのは、これどのように機能するかです。A <:< B構文的にはタイプと同等であることを理解してい<:<[A, B]ます。しかし、がの場合に限り、コンパイラがその型の暗黙を見つける方法がわかりませんA <: B私はと仮定asInstanceOfの定義における通話が$conforms何らかの形でこれを可能にしているが、どのように?また、objectを使用するだけでなく、抽象クラスのシングルトンインスタンスを使用することも重要です。

トラビスブラウン

次の単純な型階層があるとします。

trait Foo
trait Bar extends Foo

私たちはBar拡張する証拠を求めることができますFoo

val ev = implicitly[Bar <:< Foo]

を使用してコンソールでこれを実行すると-Xprint:typer、次のように表示されます。

private[this] val ev: <:<[Bar,Foo] =
  scala.this.Predef.implicitly[<:<[Bar,Foo]](scala.this.Predef.$conforms[Bar]);

そのため、コンパイラーは$conforms[Bar]、要求した暗黙の値として選択しました。もちろん、この値には型Bar <:< Barがあり<:<ますが、2番目の型パラメーターが共変であるため、これはのサブタイプでありBar <:< Foo、法案に適合します。

(Scalaコンパイラーが探しているタイプのサブタイプを見つける方法を知っているという事実には、ここにいくつかの魔法が関わっていますが、それはかなり一般的なメカニズムであり、その動作はそれほど驚くことではありません。)

ここで、以下をBar拡張する証拠を要求するとしますString

val ev = implicitly[Bar <:< String]

オンにすると-Xlog-implicits、次のように表示されます。

<console>:9: $conforms is not a valid implicit value for <:<[Bar,String] because:
hasMatchingSymbol reported error: type mismatch;
 found   : <:<[Bar,Bar]
 required: <:<[Bar,String]
       val ev = implicitly[Bar <:< String]
                          ^
<console>:9: error: Cannot prove that Bar <:< String.
       val ev = implicitly[Bar <:< String]
                          ^

コンパイラーはBar <:< Bar試行しますが、BarはではないためString、これはのサブタイプではないBar <:< Stringため、必要なものではありません。しかし$conforms、コンパイラが<:<インスタンスを取得できる唯一の場所であるため(独自に定義していない限り、危険です)、このナンセンスなコンパイルを適切に拒否します。


2番目の質問に対処するに<:<[-From, +To]は、この型クラスの型パラメーターが役立つためクラスが必要です。シングルトンAny <:< Any値は、オブジェクトとして定義することもできます。val匿名クラスを使用するかどうかの決定は、ほぼ間違いなく少し簡単ですが、これは実装の詳細であり、心配する必要はありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

OR演算子はSQLでどのように機能しますか?

分類Dev

Rubyの。()演算子はどのように機能しますか?

分類Dev

NOT(!)、AND(&&)などの演算子はJavaでどのように機能しますか?

分類Dev

条件演算子/三項演算子はどのように機能しますか?C ++

分類Dev

三項演算子はどのように機能しますか?

分類Dev

三項演算子はどのように機能しますか

分類Dev

jq- | =演算子はどのように機能しますか?

分類Dev

"| =" PHP演算子はどのように機能しますか?

分類Dev

Javaではシフト演算子はどのように機能しますか?

分類Dev

jsではコンマ演算子はどのように機能しますか?

分類Dev

この...演算子はPHPでどのように機能しますか?

分類Dev

比較演算子はnullintでどのように機能しますか?

分類Dev

EL empty演算子はJSFでどのように機能しますか?

分類Dev

条件演算子(?:)はC ++でどのように機能しますか?

分類Dev

sizeof演算子はCでどのように機能しますか?

分類Dev

PHPで3値演算子と比較演算子はどのように機能しますか?

分類Dev

「ifおよび(ne)」演算子は実はどのように機能しますか?

分類Dev

演算子なしのこの「if」はどのように機能しますか?

分類Dev

Erlang比較演算子はどのように正確に機能しますか?

分類Dev

これらの論理演算子はどのように機能しますか?

分類Dev

MATLABのコロン演算子はどのように機能しますか?

分類Dev

JavaScriptのチェーン演算子はどのように機能しますか?

分類Dev

javascriptの削除演算子はどのように機能しますか?

分類Dev

Javascriptの左シフト演算子はどのように機能しますか?

分類Dev

演算子以上のSwift文字列はどのように機能しますか

分類Dev

「/ ^ $ /」のこれらの演算子は何ですか?この場合、どのように機能しますか?

分類Dev

Javaキャスト演算子はどのように機能しますか?

分類Dev

コンマ演算子はどのように機能しますか

分類Dev

メソッド参照演算子。:はどのように機能しますか?

Related 関連記事

  1. 1

    OR演算子はSQLでどのように機能しますか?

  2. 2

    Rubyの。()演算子はどのように機能しますか?

  3. 3

    NOT(!)、AND(&&)などの演算子はJavaでどのように機能しますか?

  4. 4

    条件演算子/三項演算子はどのように機能しますか?C ++

  5. 5

    三項演算子はどのように機能しますか?

  6. 6

    三項演算子はどのように機能しますか

  7. 7

    jq- | =演算子はどのように機能しますか?

  8. 8

    "| =" PHP演算子はどのように機能しますか?

  9. 9

    Javaではシフト演算子はどのように機能しますか?

  10. 10

    jsではコンマ演算子はどのように機能しますか?

  11. 11

    この...演算子はPHPでどのように機能しますか?

  12. 12

    比較演算子はnullintでどのように機能しますか?

  13. 13

    EL empty演算子はJSFでどのように機能しますか?

  14. 14

    条件演算子(?:)はC ++でどのように機能しますか?

  15. 15

    sizeof演算子はCでどのように機能しますか?

  16. 16

    PHPで3値演算子と比較演算子はどのように機能しますか?

  17. 17

    「ifおよび(ne)」演算子は実はどのように機能しますか?

  18. 18

    演算子なしのこの「if」はどのように機能しますか?

  19. 19

    Erlang比較演算子はどのように正確に機能しますか?

  20. 20

    これらの論理演算子はどのように機能しますか?

  21. 21

    MATLABのコロン演算子はどのように機能しますか?

  22. 22

    JavaScriptのチェーン演算子はどのように機能しますか?

  23. 23

    javascriptの削除演算子はどのように機能しますか?

  24. 24

    Javascriptの左シフト演算子はどのように機能しますか?

  25. 25

    演算子以上のSwift文字列はどのように機能しますか

  26. 26

    「/ ^ $ /」のこれらの演算子は何ですか?この場合、どのように機能しますか?

  27. 27

    Javaキャスト演算子はどのように機能しますか?

  28. 28

    コンマ演算子はどのように機能しますか

  29. 29

    メソッド参照演算子。:はどのように機能しますか?

ホットタグ

アーカイブ