【问题标题】:Scala compilation issue when using Java library with interface using generic type使用带有泛型类型接口的 Java 库时的 Scala 编译问题
【发布时间】:2016-08-06 10:42:24
【问题描述】:

在一个 Scala 项目中,我使用的是 Java livrary (bouncycastle)。

我在使用需要实现泛型类型的对象的方法时遇到编译问题。

这是Java中的接口:

public interface Selector<T> extends Cloneable
{
    boolean match(T obj);
    Object clone();
}

这是一段无法编译的代码:

def verify(data: File): Boolean = {
    val signedData = new CMSSignedData(new CMSProcessableFile(data), Base64.decode(this.value))
    val certStore = signedData.getCertificates
    val signers = signedData.getSignerInfos.getSigners
    val signer = signers.iterator.next
    val certs = certStore.getMatches(signer.getSID)
    val cert = certs.iterator.next.asInstanceOf[X509CertificateHolder]
    signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert))
}

当我编译代码时,我得到以下错误:

[error]  found   : org.bouncycastle.cms.SignerId
[error]  required: org.bouncycastle.util.Selector[?0]
[error]     val certs = certStore.getMatches(signer.getSID)

我尝试过强制转换,但没有编译。

你能帮忙吗?

问候,

【问题讨论】:

  • getMatches 的签名是什么?

标签: scala generics interface compiler-errors


【解决方案1】:

如果查看https://www.bouncycastle.org/docs/pkixdocs1.5on/org/bouncycastle/cms/CMSSignedData.htmlgetCertificates 返回一个原始的Store 对象而不是Store&lt;Something&gt;。一般来说,Scala 不支持使用原始类型(它们仅存在于 Java 中以与 Java-5 之前的代码互操作)。它被记录为

将此 SignedData 结构中的任何 X.509 证书对象作为 X509CertificateHolder 对象的存储返回。

所以你可以试试

val certStore = signedData.getCertificates.asInstanceOf[Store[X509CertificateHolder]]

您还需要在返回原始StoreSelector 的任何其他地方进行强制转换。

【讨论】:

    【解决方案2】:

    这是我修改的:

    def verify(data: File): Boolean = {
      val signedData = new CMSSignedData(new CMSProcessableFile(data), Base64.decode(this.value))
      val certStore = signedData.getCertificates.asInstanceOf[Store[X509CertificateHolder]]
      val signers = signedData.getSignerInfos.getSigners
      val signer = signers.iterator.next
      val certs = certStore.getMatches(signer.getSID.asInstanceOf[Selector[X509CertificateHolder]])
      val cert = certs.iterator.next
      signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert))
    }
    

    现在,代码编译没有问题了!

    非常感谢。

    亲切的问候,

    【讨论】:

      猜你喜欢
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 2021-10-03
      • 2022-01-22
      相关资源
      最近更新 更多