scalaタイプシステム:12)view bounds
1608 ワード
昔、行き交う山の中でC#をシミュレートするusingコードを送ったことがあります.
エリック(薬剤師)は見た後、
または同等:
しかしtraitのタイプパラメータに
さらに、上記のusingメソッドで宣言された構造タイプ
def using[ C <: { def close(): Unit }, T ] (resource: C) (handle: C => T): T = { try { handle(resource) } finally { closeQuietly(resource) } }
エリック(薬剤師)は見た後、
<%
のほうがいいと言いました.<%
は「view bounds」(視野)を意味する、<:
よりも適用範囲が広く、すべてのサブタイプに加えて、過去のタイプを暗黙的に変換することができる.エラーが発生しない前提条件は,AがBのサブタイプであるか,AがBに暗黙的に変換できるかである.そうしないとmethod法に問題がある.def method [A <% B](arglist): R = ...
def method [A](arglist)(implicit viewAB: A => B): R = ...
または同等:
implicit def conver(a:A): B = … , A B , method 。 def method [A](arglist): R = ...
<%
メソッドの使用に加えて、classがタイプパラメータを宣言する場合にも使用できます.scala> class A[T <% Int] defined class A
しかしtraitのタイプパラメータに
<%
を使用することはできません.scala> trait A[T <% Int] <console>:1: error: traits cannot have type parameters with context bounds `: ...' nor view bounds `<% ...'
さらに、上記のusingメソッドで宣言された構造タイプ
{def close():Unit}
に注意してください.その実装は反射によって行われているので、パフォーマンスの問題があります.パフォーマンスを考慮する必要があるシーンでは、java.io.Closeable
インタフェースがより適切で、柔軟性とパフォーマンスを常に選択する必要があります.