gpt4 book ai didi

scala - 如何匹配函数签名而不在 Scala 中收到类型删除编译器警告

转载 作者:行者123 更新时间:2023-12-01 02:58:10 25 4
gpt4 key购买 nike

任何人都可以重写这段代码来做同样的事情,但没有任何编译器警告:-

object TestTypeErasure {

def main(args:Array[String]) {

def myFunction(myObject:Any):Boolean = {
true
}

val myVariable: (Any => Boolean) = myFunction

myVariable match {
case function:(Any => Boolean) => println("Match")
}

}
}

千谢谢

基思

更新!!!!。很抱歉对此进行了真正的散列。这是我关于 SO 的第一个问题

只是为了让大师知道我已经尝试了类似的方法也无济于事:-(无法编译它)
object TestTypeErasure {  

def doTest(parameter: Any) = {
parameter match {
case function:Function1[_, _] => function("Whatever")
}
}

def main(args:Array[String]) {
}

}

我收到错误:-
TestTypeErasure.scala:6: error: type mismatch;
found : java.lang.String("Whatever")
required: _
case function:Function1[_, _] => function("Whatever")
^
one error found

再次感谢

基思

最佳答案

您可以使用 list 捕获类型信息。 (为了简单起见,T、R 在这里是不变的。)

import scala.reflect._
def matchFunction[T,R](f: Function1[T,R], t : T)(implicit mt : Manifest[T], mr : Manifest[R]) = {
val result = if ((mt.erasure, mr.erasure) == (classOf[Any], classOf[Boolean])) "any, boolean " + f(t)
else if((mt.erasure, mr.erasure) == (classOf[Int], classOf[Int])) "int, int " + f(t)
else "Unknown " + f(t)
println(result)
}

scala> matchFunction((x : Int) => x + 1, 1)
int, int 2

scala> matchFunction((x : Any) => true, 1 : Any)
any, boolean true

scala> matchFunction((x : Boolean) => ! x, false)
Unknown

对于 Scala 2.8,可以使用上下文边界,删除两个隐式参数:
import scala.reflect._
def matchFunction[T: Manifest,R : Manifest](f: Function1[T,R], t : T) = {
val mt = implicitly[Manifest[T]]
val mr = implicitly[Manifest[T]]
val result = if ((mt.erasure, mr.erasure) == (classOf[Any], classOf[Boolean])) "any, boolean " + f(t)
else if((mt.erasure, mr.erasure) == (classOf[Int], classOf[Int])) "int, int " + f(t)
else "Unknown " + f(t)
println(result)
}

关于scala - 如何匹配函数签名而不在 Scala 中收到类型删除编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2133134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com