Advertisement
Guest User

Untitled

a guest
Aug 6th, 2014
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.86 KB | None | 0 0
  1. package database
  2.  
  3. import scala.reflect.ClassTag
  4.  
  5. trait Mapper[T] {
  6.   def map(row: List[Any]): T
  7. }
  8.  
  9. object TestMapper {
  10.  
  11.   def getMapper[T: ClassTag](outer: Option[AnyRef] = None) = {
  12.  
  13.     val tt = implicitly[ClassTag[T]]
  14.  
  15.     val rclass = tt.runtimeClass
  16.  
  17.     val ctor = rclass.getConstructors()(0)
  18.     val ctypes = ctor.getParameterTypes
  19.  
  20.     ctypes.foreach(println)
  21.  
  22.     val cl = getClass
  23.  
  24.     new Mapper[T] {
  25.       def map(row: List[Any]): T = {
  26.         if(outer.isDefined)
  27.           ctor.newInstance(outer.get::row.map(_.asInstanceOf[Object]):_*).asInstanceOf[T]
  28.         else
  29.           ctor.newInstance(row.map(_.asInstanceOf[Object]):_*).asInstanceOf[T]
  30.       }
  31.     }
  32.   }
  33. }
  34.  
  35. object ExternalCaseClasses {
  36.   case class ExternalYoba(size: Int, color: String)
  37. }
  38.  
  39. class TestMapper {
  40.  
  41.   import TestMapper._
  42.   import ExternalCaseClasses._
  43.  
  44.   def callAnonByName(f: => Unit) = f
  45.  
  46.   callAnonByName {       // никакого отсоса
  47.     getMapper[ExternalYoba]().map(List(10, "yellow"))
  48.   } //работает
  49.  
  50.   def outerMethod() = {  // отсос средней величины, но пока что терпимо
  51.     case class InternalYoba(size: Int, color: String)
  52.     getMapper[InternalYoba](Some(this)).map(List(100, "red"))
  53.   }
  54.  
  55.   outerMethod() //работает
  56.  
  57.   val anonFunc: () => Unit = () => { // пукан нехило разогрелся
  58.     case class InternalYoba(size: Int, color: String)
  59.     getMapper[InternalYoba](Some(anonFunc)).map(List(100, "red"))
  60.   }
  61.  
  62.   anonFunc() //работает
  63.  
  64.   callAnonByName {       // непреодолимый отсос, пукан на небесах
  65.     case class InternalYoba(size: Int, color: String)
  66.     getMapper[InternalYoba](Some(this)).map(List(10, "jack"))
  67.   }   // кровь кишки экспешон
  68.  
  69. }
  70.  
  71. object Run extends App {
  72.   new TestMapper
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement