gpt4 book ai didi

scala - 测试给定实例是否是 Scala 中给定类的(子)类

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

假设你给出了一个 List[Class[_ <: Base]] 的实例,并说许多类扩展了 Base :

class A extends Base
class B extends Base
class C extends A

等等'...
现在,给定的列表可能只包含一些类。例如: val classes = classOf[A] :: Nil ,好吧,当我得到一个实例化的 val 时,我该如何测试?如果它的类属于列表中的类型,或者它是列表中某个类的子类?即您将如何实现: def testClass(class : List[Class[_ <: Base]], instance : Base) : Boolean什么时候:
val classes = classOf[A] :: Nil
testClass(classes, new A) // should return true
testClass(classes, new B) // should return false
testClass(classes, new C) // should return true

用例:
我正在尝试编写一个通用的重试模式,即获取一些非常容易出错的代码,并且我想重试执行它的最大尝试次数,当每次失败时,它应该执行一些“等待”方法。
例如
retryRequest({
//Some code that throws exceptions
}, classOf[SomeException] :: classOf[SomeOtherException] :: Nil,
100, {Thread.sleep(5000)})

好吧,这工作正常,但它不会测试给定异常的子类:
def retryRequest(req : => Unit, validExceptions : List[Class[_ <: java.lang.Throwable]], tries : Int, waitMethod : => Unit) {
var keepTrying = false
var tryCount = 0
do{
try{
logger.debug("retryRequest, try #" + tryCount)
keepTrying = false
req
}catch{
case ex if(tryCount >= tries && validExceptions.contains(ex.getClass)) => {
throw new MaxTriesReachedException("tried for " + tryCount + "times, but no luck. " +
"you may want to try ommitting generic exceptions types from the given list.")
}
case ex if (validExceptions.contains(ex.getClass)) => {
logger.debug("intercepted " + ex.toString)
tryCount += 1
keepTrying = true
waitMethod
}
}
}while(keepTrying)
}

我真的很想更换:
validExceptions.contains(ex.getClass)

像这样:
validExceptions.exists(exClass => ex.isInstanceOf[exClass]) //won't compile

是否可以?如何?

最佳答案

更简单的方法是使用 util.control.Exception :

  def retryRequest(req: => Unit, 
validExceptions: List[Class[_ <: Throwable]],
tries: Int,
waitMethod: => Unit): Unit =
(Exception.catching(validExceptions:_*) withApply { e =>
waitMethod
if (tries > 1) retryRequest(req, validExceptions, tries - 1, waitMethod)
}) { req }

retryRequest( { println("a"); throw new Exception },
List(classOf[Exception]),
3,
Thread.sleep(100))

简而言之: withApply当异常之一传递给 catching 时,采用一个闭包来处理这种情况。被抛出。在我们的例子中,我们只是递归地调用自己(鉴于重试次数很少,我认为这不是问题)。

关于scala - 测试给定实例是否是 Scala 中给定类的(子)类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12618072/

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