scala - Difficulty writing method with partially applied type parameter and typetag -


i looking way remove type parameter s call apply in following example:

object attribute {   trait int    [s] extends attribute[s]   trait boolean[s] extends attribute[s]  // etc. } sealed trait attribute[s]  trait attributes[s] {   protected def get(key: string): option[attribute[s]]    def apply[a <: attribute[s]](key: string)                               (implicit tag: reflect.classtag[a]): option[a] =      get(key) match {       case some(attr: a) => some(attr)       case _             => none     } } 

with above definition, test case be:

trait test[s] {   def map: attributes[s]    map[attribute.int[s]]("foo") } 

what i'm trying do, modify apply definition allow following:

trait test2[s] {   def map: attributes[s]    map[attribute.int]("foo")   // use partially applied attribute type } 

edit: following on suggestion of marius , comments, why following still producing erasure warning:

import reflect.runtime.universe._  trait attributes[s] {   protected def get(key: string): option[attribute[s]]    def apply[a[x] <: attribute[x]](key: string)                                  (implicit tag: typetag[a[s]]): option[a[s]] =     get(key) match {       case some(attr: a[s]) => some(attr)       case _                => none     } } 

to me doesn't make sense. on 1 hand have full type tag a[s] available. on other hand, should work in absence, attribute invariant in s, if option[attribute[s]], , match against some(attr: a[x]), possibility x == s.


edit 2: condition solution shape of attribute trait not changed, e.g. not moving type constructor parameter s member field.

have considered leveraging unapply of implicit classtag? if understand docs correctly, unapply tag return none if attr not match type. if match, return of type a[s]. refactored use unapply, code this:

def apply[a[_] <: attribute[_]](key: string)   (implicit tag: reflect.classtag[a[s]]): option[a[s]] =   get(key) match {     case some(attr) => tag.unapply(attr)     case _             => none   } 

Comments

Popular posts from this blog

Perl - how to grep a block of text from a file -

delphi - How to remove all the grips on a coolbar if I have several coolbands? -

javascript - Animating array of divs; only the final element is modified -