方法があれば...
def arrayConformsTo[A](as: Array[_]) = ???
...必要に応じてContext Boundsを追加できA
ます。このメソッドが のコンポーネント タイプを調べて、Array
これが のサブタイプである場合は true を返しますA
。たとえば、次のようになります。
arrayConformsTo[Int](Array(1, 2, 3)) //returns true
arrayConformsTo[String](Array(1, 2, 3)) //returns false
2.10 より前では、これは次のように行われていました。
def arrayConformsTo[A: Manifest](as: Array[_]) =
ClassManifest.fromClass(as.getClass.getComponentType) <:< manifest[A]
ただし、これは非推奨の警告でコンパイルされるようになりました
<console>:8: warning: method <:< in trait ClassManifestDeprecatedApis is deprecated: Use scala.reflect.runtime.universe.TypeTag for subtype checking instead
ClassManifest.fromClass(as.getClass.getComponentType) <:< manifest[A]
^
<console>:8: warning: value ClassManifest in object Predef is deprecated: Use scala.reflect.ClassTag instead
ClassManifest.fromClass(as.getClass.getComponentType) <:< manifest[A]
これに対する私の最初の推測は次のとおりです。
scala> def arrayConformsTo[A: reflect.ClassTag](as: Array[_]) =
| reflect.ClassTag(as.getClass.getComponentType) <:< implicitly[reflect.ClassTag[A]]
しかし、これは非推奨の警告も出します
<console>:8: warning: method <:< in trait ClassManifestDeprecatedApis is deprecated: Use scala.reflect.runtime.universe.TypeTag for subtype checking instead
reflect.ClassTag(as.getClass.getComponentType) <:< implicitly[reflect.ClassTag[A]]
^
を使用するように指示されますTypeTag
。しかし、どのように?これは反省を求めるのに有効なことですか?
付録:これは私が必要としているものにはかなりうまくいくようですが、次のものには機能しませんAnyVal
:
scala> def arrayConformsTo[A: reflect.ClassTag](as: Array[_]) =
| implicitly[reflect.ClassTag[A]].runtimeClass isAssignableFrom as.getClass.getComponentType