Scala数组类型不匹配

时间:2015-09-08 07:18:11

标签: arrays scala casting

我对scala相当新,并且不完全理解类型转换。但我有一个像这样的库方法:

def getSecurityToken(
    endpointUrl:String ,
    stsEndpoint:String ,
    certificateChain:Array[Certificate] ,
    privateKey:PrivateKey
  )
  :SecurityToken

我打算致电...但我.getCertificateChain的结果会返回Array[509Certificate]

因此getSecurityToken会发出此错误:

[error]  found   : Array[java.security.cert.X509Certificate]
[error]  required: Array[java.security.cert.Certificate]
[error] Note: java.security.cert.X509Certificate <: java.security.cert.Certificate, but class Array is invariant in type T.
[error] You may wish to investigate a wildcard type such as `_ <: java.security.cert.Certificate`. (SLS 3.2.10)
[error]         security.getSecurityToken(DefaultConstants.CORE_ENDPOINT, DefaultConstants.STS_ENDPOINT, certificateChain, privateKey);

我尝试使用var certificateChain: Array[_ <: Certificate](由我的getCertificateChain返回)更改数组,但这给了我:

[error]  found   : Array[_$1] where type _$1 <: java.security.cert.Certificate

有人可以解释一下如何通过使用一系列儿童对象来解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

我认为Type Ascription可能足以解决您的问题。

使用以下代码简化您的案例。

class XX
class XXX extends XX

// an up-cast on Array(new XXX, new XXX)
val a1: Array[XX] = Array(new XXX, new XXX)
def func(x: Array[XX]) = x

// res0: Array[XX] = Array(XXX@7a1234bf, XXX@2f62ea70)
func(a1)

在你的情况下,它会是这样的:

// 509Certificate <: Certificate
val a1: Array[Certificate] = Array[509Certificate]

然后你可以将a1传递给getSecurityToken。

答案 1 :(得分:1)

Scala数组是不变的,因为它只是Java可变数组的包装器。

如果无法更改方法签名,则必须创建所需类型的数组(Array[Certificate],而不是Array[_ <: Certificate])

只需使用toArray方法。

getSecurityToken("something", "something", certificateChain.toArray, privateKey)