我对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
有人可以解释一下如何通过使用一系列儿童对象来解决这个问题吗?
答案 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)