gpt4 book ai didi

generics - 高阶泛型函数中的 ClassCastException

转载 作者:行者123 更新时间:2023-12-03 06:44:33 33 4
gpt4 key购买 nike

我有一个代码试图将一个函数包装在另一个执行动态类型检查的函数中:

class Base

class Foo extends Base

class Bar extends Base

object Main{
def checker[A <: Base]( func : A => String) : Base => String =
(b : Base) => b match {
case a : A => func(a)
case _ => "error"
}

def fooFunc(f : Foo) = "It's a foo"

def main(arg : Array[String]) {
val check = checker(fooFunc)

println(check(new Foo) + ", " + check(new Bar))
}
}

这会产生以下错误:

Exception in thread "main" java.lang.ClassCastException: Bar cannot be cast to Foo
at Main$$anonfun$1.apply(Main.scala:17)
at Main$.main(Main.scala:19)
at Main.main(Main.scala)

如果我在检查器的定义中删除类型参数并将 A 替换为 Foo,则效果很好。但是,如果我保留类型参数但省略函数参数并将 func(a) 替换为“good”,则 Foo 和 Bar 都会得到“good”。

这就是所谓的类型删除吗?我不太熟悉这个概念..
另外,我很想听到有关此问题的解决方案。

最佳答案

我找到了一种使用 list 的方法。

class Base

class Foo extends Base

class Bar extends Base

trait Functor[A] {
def apply[B](b : B)(implicit mb : Manifest[B]) : A
}

case class Checker[A](func : A => String)(implicit manifest : Manifest[A]) extends Functor[String]{
def apply[B](b : B)(implicit mb : Manifest[B]) = {
if (mb == manifest) func(b.asInstanceOf[A])
else "error"
}
}

object Main{
def fooFunc(f : Foo) = "good"

def main(arg : Array[String]) {
val check = Checker(fooFunc)

println(check(new Foo) + ", " + check(new Bar))
}
}

我仍然想听听那些知道自己在做什么的人的建议。

关于generics - 高阶泛型函数中的 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9645459/

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