第二次尝试模式匹配失败

pattern matching fails on second try

我正在使用以下代码来模式匹配 PrivateKey 的实例:

import java.security.interfaces.{RSAPrivateKey, RSAPublicKey}
import java.security.{PrivateKey, PublicKey} 

object ClientPrivateKey {
  def apply(privateKey: PrivateKey) = privateKey match {
    case k: RSAPrivateKey ⇒ RSAClientPrivateKey(k)
    case k: EdDSAPrivateKey ⇒ EDCClientPrivateKey(k)
  }
}

val pk: PrivateKey = ....
ClientPrivateKey(pk)

当 运行ning 使用 sbt ~test 进行测试时,我遇到了一个奇怪的行为。在第一个 运行 测试通过,在随后的尝试中,没有重新启动 sbt,测试失败:

[info]   scala.MatchError: net.i2p.crypto.eddsa.EdDSAPrivateKey@e5d5feef (of class net.i2p.crypto.eddsa.EdDSAPrivateKey)
[info]   at com.advancedtelematic.libtuf.data.ClientDataType$ClientPrivateKey$.apply(ClientDataType.scala:39)
[info]   at com.advancedtelematic.tuf.keyserver.daemon.KeyGenerationOp$$anonfun$saveToVault.apply(KeyGeneratorLeader.scala:122)
[info]   at com.advancedtelematic.tuf.keyserver.daemon.KeyGenerationOp$$anonfun$saveToVault.apply(KeyGeneratorLeader.scala:121)
[info]   at scala.concurrent.Future$$anonfun$traverse.apply(Future.scala:576)
[info]   at scala.concurrent.Future$$anonfun$traverse.apply(Future.scala:575)
[info]   at scala.collection.TraversableOnce$$anonfun$foldLeft.apply(TraversableOnce.scala:157)
[info]   at scala.collection.TraversableOnce$$anonfun$foldLeft.apply(TraversableOnce.scala:157)

这很奇怪,因为 net.i2p.crypto.eddsa.EdDSAPrivateKey 匹配被匹配对象的类型。

什么会干扰此模式匹配?

我想到的一件事是,您的 privateKey 可能来自与您的模式匹配代码默认使用的不同的类加载器。

你可以测试这个,例如像那样:

def apply(privateKey: PrivateKey) = privateKey match {
  case k: RSAPrivateKey ⇒ RSAClientPrivateKey(k)
  case k: EdDSAPrivateKey ⇒ EDCClientPrivateKey(k)
  case k if k.getClass.getName == classOf[EdDSAPrivateKey].getName =>
    val sameClasses = k.getClass == classOf[EdDSAPrivateKey]
    val sameClasses = k.getClass.getClassLoader == classOf[EdDSAPrivateKey].getClassLoader
    throw new Exception(s"Different class loaders? $sameClasses $sameClassLoaders")
}