Я пытаюсь создать собственные разнородные списки и карты. Хотя есть примеры использования Manifest, в Scala 2.10 они устарели, и я должен использовать TypeTags (или Classtags). В случае с картами кажется, что я могу сохранить привязку Any к Type, используя (скажем) кортеж String->(TypeTag[ _ ‹: Any ], Any ).
Моя проблема заключается в том, как получить из восстановленного TypeTag и неопределенного T, чтобы иметь возможность вернуть экземпляр TypeTag.tpe - в той точке кода, где у меня есть //** How do I use saved typeTag to define T here?**
Как написано, в методе get нет ошибок компилятора, но T имеет значение Nothing и возвращает Some(Nothing). Я хотел бы, чтобы моя закомментированная строка работала: case Some( x ) => // println( "Get 2*'pi'=" + x*2 )
, где есть сообщение компилятора, «значение * не является членом Nothing». Я понимаю, что мог бы написать более компактно, но когда это сделано, я могу навести указатель мыши в своей IDE и следовать шаг за шагом. Есть связанный с этим вопрос - Scala: что такое TypeTag и как его использовать? но, похоже, он не проходит «последнюю милю» — перемаркировку Any.
Как это сделать?
Here is the code I have so far:
import scala.reflect._
import scala.reflect.runtime.universe._
import collection.mutable.Map
object Test extends HMap {
def main( args: Array[ String ] ) {
var hmap = new HMap
hmap( "anInt" ) = 1
hmap( "pi" ) = 3.1416f
hmap( "c" ) = "hello"
// Test
val result = hmap.get( "pi" )
result match {
case Some( x ) =>
println( "Get 'pi'=" + x*2 )
case _ =>
}
}
}
class HMap {
private var coreMap =
Map.empty[ String, ( TypeTag[ _ <: Any ], Any ) ]
// Save the type tag with the value
def update[ T: TypeTag ]( key: String, value: T ) =
coreMap.put( key, ( typeTag[ T ], value ) )
override def toString = coreMap.toString
def get[ T: TypeTag ]( key: String ): Option[ T ] = {
val option = coreMap.get( key )
val result = option match {
case None => None
case Some( x ) => {
val typeTag = x._1; val value = x._2
println( "Matched Type = " +
typeTag.tpe + " Value=" + value )
// **** How do I use saved typeTag to define T here? ****
val v = value.asInstanceOf[ T ]
val s = Some( v )
println( "Returning " + s )
s
}
}
result
}
}
get
с предоставленной подписью, которая будет работать так, как вы хотите, даже с манифестами. - person Eugene Burmako   schedule 31.10.2012