私はメソッドを持っている場合は...新しいリフレクションAPIを使用して、配列のコンポーネントタイプが型パラメータに準拠しているかどうかを確認するにはどうすればよいですか?必要に応じて、私は<code>A</code>に<em>コンテキスト境界</em>を追加することができます
def arrayConformsTo[A](as: Array[_]) = ???
...。このメソッドでArray
のコンポーネントタイプを調べ、A
のサブタイプであればtrueを返します。
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]
私の最初の推測でコンパイル:だから、たとえば次のよう
arrayConformsTo[Int](Array(1, 2, 3)) //returns true
arrayConformsTo[String](Array(1, 2, 3)) //returns false
前2.10に、これが行われていたであろう
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
それは素晴らしいです!あなたがいなくても、私はあなたの答えを編集してそれを受け入れる前に別の解決策を与えるつもりです –