scala绑定特征的类型参数与函数的类型参数

用几句话来解释问题是很困难的,所以我准备了一堆代码来表达问题。

让我们开发Container[T1,T2]类型的Container[T1,T2]并暗示包装该容器中的任何值。 如果值是Container[T1,T2]类型,则换行应该返回相同的类型。 更多的包装方法应该采用T1类型的参数(与容器中的相同),并由容器取代T1值。 解决方案必须符合泛型和含蓄方式。

听起来有点混乱,让我们看看代码:)

  • 容器:

    case class Container[T1, T2](t1: T1, t2: T2)
    
  • 包装方法的特点:

      trait ToContainer[A] {
        def wrappingMethod[E](e: E): Container[E, A]
      }
    
  • 带有暗示的对象:

      object ToContainers {
        import language.implicitConversions
    
        implicit def implicitMethod[A](a: => A) = new ToContainer[A] {
          def wrappingMethod[E](e: E): Container[E, A] = Container(e, a)
        }
    
        implicit def implicitMethod2[E, A] (c: => Container[E, A])(implicit d:DummyImplicit): ToContainer[A] = new ToContainer[A] {
          def wrappingMethod[EX](e: EX): Container[EX, A] = c.copy(e)
        }
      }
    
  • 那就是代码。

    问题是我需要以某种方式将def wrappingMethod[EX]函数的类型参数EX绑定到def implicitMethod2[E, A]的参数E

    之后,像这样的东西应该可以工作(和工作):

            scala>  import     ToContainers._
            import ToContainers._
    
            scala>  val c1: Container[String, Int] = 1234.wrappingMethod("abc")
            c1: Container[String,Int] = Container(abc,1234)
    
            scala>  val c2: Container[String, Int] = c1.wrappingMethod("XXX")
            c2: Container[String,Int] = Container(XXX,1234)
    

    ...但这必须产生编译错误,并且不 :( :(看看类型:c1有[String,Int]和c3有[Int,Int],我想阻止这个。)

            scala>  val c3 = c1.wrappingMethod(0)
            c3: Container[Int,Int] = Container(0,1234)
    

    任何想法非常感谢:)

    顺便说一句:我正在使用这个版本的Scala:

    欢迎来到Scala版本2.10.0-M7(Java HotSpot™64位服务器VM,Java 1.7.0_07)

    编辑:

    我已经疯了一些错误。 代码现在正在工作。


    您提供的示例代码不起作用,所以提供一个好的答案有点困难。 但是,你不能只是这样做:

    implicit def implicitMethod2[E, A] (c: => Container[E, A])(implicit d:DummyImplicit): ToContainer[A] = new ToContainer[A] {
      def wrappingMethod[E](e: E): Container[EX, A] = c.copy(e)
    }
    

    所以简单地用E替换EX类型参数。


    您需要将类型参数E移至ToContainer

    trait ToContainer[E, A]
    
      def wrappingMethod(e: E): Container[E, A]
    
    }
    
    object ToContainers {
      import language.implicitConversions
    
      implicit def implicitMethod[E, A](a: => A) = new ToContainer[E, A] {
    
        def wrappingMethod(e: E): Container[E, A] = Container(e, a)
    
      }
    
      implicit def implicitMethod2[E, A] (c: => Container[E, A])(implicit d:DummyImplicit): ToContainer[E, A] = new ToContainer[E, A] {
    
        def wrappingMethod(e: E): Container[E, A] = c.copy(e)
    
      }
    
    }
    
    链接地址: http://www.djcxy.com/p/51023.html

    上一篇: scala bind type parameter of trait with type parameter of function

    下一篇: Type parameter does not extend given type