第二次尝试时模式匹配失败

时间:2017-06-29 10:09:53

标签: scala jce

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

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) 运行测试时,我会遇到一种奇怪的行为。在第一次运行时,测试通过,在后续尝试中,无需重新启动sbt,测试失败并显示:

sbt ~test

这很奇怪,因为[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$1.apply(KeyGeneratorLeader.scala:122) [info] at com.advancedtelematic.tuf.keyserver.daemon.KeyGenerationOp$$anonfun$saveToVault$1.apply(KeyGeneratorLeader.scala:121) [info] at scala.concurrent.Future$$anonfun$traverse$1.apply(Future.scala:576) [info] at scala.concurrent.Future$$anonfun$traverse$1.apply(Future.scala:575) [info] at scala.collection.TraversableOnce$$anonfun$foldLeft$1.apply(TraversableOnce.scala:157) [info] at scala.collection.TraversableOnce$$anonfun$foldLeft$1.apply(TraversableOnce.scala:157) 匹配匹配对象的类型。

什么可能干扰这种模式匹配?

1 个答案:

答案 0 :(得分:1)

我想到的一件事是你的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")
}