第二次尝试模式匹配失败
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")
}
我正在使用以下代码来模式匹配 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")
}