scalaタイプシステム:12)view bounds


昔、行き交う山の中でC#をシミュレートする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インタフェースがより適切で、柔軟性とパフォーマンスを常に選択する必要があります.