Using Scala structural types with abstract types

后端 未结 1 1426
傲寒
傲寒 2021-02-14 14:52

I\'m trying to define a structural type defining any collection that has an \"add\" method (for instance, a java collection). Using this, I want to define a few higher order fun

1条回答
  •  我在风中等你
    2021-02-14 15:17

    As you can see in ticket 1906 you can't use the abstract type defined outside the structural type due to missing type information at runtime.

    This is stated in the Scala Language Reference (3.2.7 Compound Types):

    Within a method declaration in a structural refinement, the type of
    any value parameter may only refer to type parameters or abstract types that are
    contained inside the refinement.
    

    The usual way to add new methods to a type is by implicit type conversion.

    trait HigherOrderFunctions[T, CC[_]] {
        def zap[V](fn: () => V): CC[V]
    }
    
    class RichJList[T](list: java.util.List[T]) extends HigherOrderFunctions[T, java.util.List]{
        def zap[V](fn: () => V): java.util.List[V] = {
            val l = new java.util.ArrayList[V]
            l add fn()
            l
        }
    }
    implicit def list2RichList[T](l : java.util.List[T]) = new RichJList(l)
    new java.util.ArrayList[AnyRef]() zap (() => 2)
    

    If the compiler sees that the type missed the zap method it will convert it to a type that has the zap method with a implicit conversion method (here list2RichList) in scope.

    scala> new java.util.ArrayList[AnyRef]() zap (() => 2)
    res0: java.util.List[Int] = [2]
    

    0 讨论(0)
提交回复
热议问题