给定具有两个类型参数的函数,scala中是否可以为单个类型传递类型参数,例如,在示例中仅提供类型A
,因为类型B
可以由函数f
编译。
def foo[A, B](f: A => B): B = {
f(null.asInstanceOf[A])
}
现在,我发现只有两个解决方案。
解决方案1(标准用法):致电foo
并指定两种类型foo[String, Int]( e => 1)
,但Int
的定义是多余的
解决方案2:将功能定义更改为
def foo[A, B](useType: A => Unit)(f: A => B): B = {
f(null.asInstanceOf[A])
}
并将其与
一起使用def use[T](t: T) = {}
val res: Int = foo(use[String]) { a => 1 }
它可以工作,但是使用函数为编译器提供类型似乎并不是很漂亮。
有没有办法为带有两个类型参数的函数指定A
类型?
答案 0 :(得分:1)
通常不会,在Scala中无法部分应用类型参数。无论是方法还是课堂。可以使用一些包装器:
def myMethod[A, B]() = ???
def myMethod1[A0, W <: Wrapper { type A = A0 }]() = ???
trait Wrapper {
type A
type B
}
可能有一些与路径相关的类型:
def myMethod1[A0, W <: Wrapper { type A = A0 }](w: W)(): w.B = ???
如果没有方法但是类有类型lambda和类型成员的方法(可以部分应用类型成员:Wrapper { type A = A0 }
trait Wrapper { type A; type B }
是Wrapper[A0, _]
的存在类型trait Wrapper[A, B]
)。