Przesłanie klasy do metody: classOf vs TypeTag

0
  1. Które wyjście jest lepsze?
  def convert[T <: Subtitles : TypeTag] = {
    typeOf[T] match {
      case t if t =:= typeOf[FrameSubtitles] => 1
      case t if t =:= typeOf[TimeSubtitles] => 2
    }
  }

  def convert[T <: Subtitles](cl: Class[T]): Int = {
    val TimeSubs = classOf[TimeSubtitles]
    val FrameSubs = classOf[FrameSubtitles]

    cl match {
      case FrameSubs => 1
      case TimeSubs => 2
    }
  }
  1. Czy stosowanie TypeTagów jest jakoś obciążające dla JVM?
  2. Out of topic: W CLR (dla .NET) nie ma takiego czegoś jak erasure, więc nie trzeba stosować obejść żeby wykryć np typ generyczny listy (e.g. Int z List[Int]). Do tej pory było to uważane za problem w JVM ale z drugiej strony, czy erasure nie ma jakiś korzystnych skutków (nie wiem, krótszy bajtkod?) ?
1
  1. Strzelam, że TypeTag jest obiektem (w sensie Scalowym) i oprócz jego wstępnego załadowania, jedynym narzutem jest konieczność przekazywania go w parametrze metody (czyli narzut jest niewielki). Oczywiście odpalanie metod na tagu też coś kosztuje, ale to tylko jeśli odpalasz metody.

  2. classOf zwraca Javową klasę po erasure, więc niewiele jest tam informacji o typie. Jeśli jest za mało to jesteś w zasadzie zmuszony użyć typetaga.

  3. Można by zapytać gości od kompilatora :]

0

Dzięki za odpowiedzi. Jeśli chodzi o podany kod to chodziło mi o TEN konkretny przypadek (wycinka z kodu programu).
Z tego co widzę, to np. akka.actor.Props ma metody:

def apply(clazz: Class[_], args: Any*)
def apply[T <: Actor]()(implicit arg0: ClassTag[T])

czyli nie ma różnicy którego użyję (mam na mysli metodę convert)?

Co do typetagów to zastanawiałem się czy po prostu nie ma to do czynienia z refleksją bo ona dość obciąża i trzeba na nią uważać (chociażby struct types (aka duck typing))

dodanie znacznika <code class="scala"> - furious programming

1

Najlepiej byłoby zdekompilować i sprawdzić co się dzieje pod maską :)

0

javap -c
http://4programmers.net/Pastebin/3147
http://4programmers.net/Pastebin/3148
Domyślam się że większy nakład pod TypeTagiem
Mam jeszcze takie pytanie, jakbym chciał się nauczyć "czytać" output javap, to jak go interpretować? Pod kątem komentarzy czy poszczególnych linii czy LocalVariableTable czy pierwszej linii "stack=3, locals=8, args_size=2"?
Bez strasznego wgłębiania się w specyfikację VM ale jednak żeby potrafić to interpretować?

1

No korzystanie z TypeTaga jak widać powoduje dużo większy narzut. Jednak przy porównywaniu Class wyjdzie że List[Int] == List[String], więc funkcjonalność Class jest dużo słabsza.

Mi bardziej chodziło o to, czy te konkretne automatycznie wygenerowane TypeTagi to singletony czy może coś tworzonego za każdym razem gdy jest potrzebne.

Kompilator Scali ma pełno opcji, niektóre z nich pozwalają podejrzeć kod który z jednej strony jest już trochę przetworzony, ale jeszcze nie do bajtkodu. Wywołać scalac -X i/ lub scalac -Y i wyszukaj jakieś opcje do wypisywania przetworzonego kodu źródłowego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1