Conditional methods of Scala generic classes with restrictions for type parameters

前端 未结 3 585
花落未央
花落未央 2021-01-05 01:10

I believe that a generic class may make one of its methods available only assuming that its type parameters conform to some additional restrictions, something like (syntax i

3条回答
  •  执念已碎
    2021-01-05 01:45

    there is another option involving implicit classes conversions

    trait Col[T] extends Traversable[T] 
    
    implicit class ColInt[T <: Int](val v : Col[T]) extends AnyVal {
        def sum : T = (0 /: v)(_ + _)
    }
    

    in this context you don't need the empty trait Col anymore, so you could further comprimize it to this:

    implicit class ColInt[T <: Int](val v : Traversable[T]) extends AnyVal {
        def sum : T = (0 /: v)(_ + _)
    }
    

    The advantage of this method is, that it tells the compiler, that type T is really a subtype of Int, so List[T] <: List[Int] is still valid in this context, and no explicit conversion needs to be added. The implicit parameter adds implicit conversions that wouldn't work on List[T], because it only introduces an implicit conversion from T to Int, not from List[T] to List[Int]

提交回复
热议问题