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