DSL といくつかのランタイム コードがあります。問題は、実行時にどこかに到達したことです:
val clazz: Class[_ <: java.io.Serializable] = classOf[java.lang.String]
val value: java.io.Serializable = "abc"
そして私はクラスを持っています
class MyWrapper[T <: java.io.Serializable](val data: T)(implicit m: Manifest[T]) {
override def toString = m.runtimeClass
}
val wrapper = new MyWrapper(value)
java.lang.String
問題は、の呼び出しから戻る必要があることですtoString
。しかし、私は得java.io.Serializable
ました。残念ながら、java.io.Serializable
サブタイプごとに固定パターン マッチングを作成することも (これはおかしいでしょう)、MyWrapper
明示的な withを作成することもできませんnew MyWrapper[String](value)
。のタイプがわかりません。value
おそらく のサブタイプですSerializable
。
値の型が変数と等しいことがわかっている場合、実行時に型/マニフェスト値を渡す方法はありますclazz
か?
更新 (Régis Jean-Gilles の解決策は機能しません)。REPL テスト:
val clazz: Class[_ <: java.io.Serializable] = classOf[java.lang.String]
val value: java.io.Serializable = "abc"
class MyWrapper[T <: java.io.Serializable](val data: T)(implicit m: Manifest[T]) {
override def toString = m.runtimeClass.getName
}
val wrapper = new MyWrapper(value)
//val wrapper = new MyWrapper(value)(ClassManifest.fromClass(clazz).asInstanceOf[ClassTypeManifest[java.io.Serializable]])
//val wrapper = new MyWrapper(value)(ClassManifest.fromClass(clazz))
System.err.println(wrapper.toString)
マニフェストを明示的に渡そうとすると、エラーが発生しました。
scala> :load test.scala
Loading test.scala...
clazz: Class[_ <: java.io.Serializable] = class java.lang.String
value: java.io.Serializable = abc
defined class MyWrapper
<console>:10: error: type mismatch;
found : scala.reflect.ClassManifest[_$1] where type _$1 <: java.io.Serializable
(which expands to) scala.reflect.ClassTag[_$1]
required: Manifest[java.io.Serializable]
val wrapper = new MyWrapper(value)(ClassManifest.fromClass(clazz))
^
<console>:8: error: not found: value wrapper
System.err.println(wrapper.toString)
また、マニフェストを明示的にキャストできません。
アプリケーションをコンパイルしようとすると、さらに奇妙なエラーが発生します -
[error] found : scala.reflect.ClassManifest[(some other)_0(in method setProperty)]
[error] (which expands to) scala.reflect.ClassTag[(some other)_0(in method setProperty)]
[error] required: Manifest[_0(in method setProperty)]
[error] new Value.Static(default, Context.virtual(element))(ClassManifest.fromClass(elementProperty.typeClass)))
IMHO Régis Jean-Gilles はソリューションに非常に近いです。Scala 2.10 で動作させるには?