我使用以下代码来模式匹配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)
匹配匹配对象的类型。
什么可能干扰这种模式匹配?
答案 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")
}