以下代码无法编译:
var next: (A, A) = (null, n)
Run Code Online (Sandbox Code Playgroud)
错误:
error: type mismatch;
found : Null(null)
required: A
var next: (A, A) = (null, n)
Run Code Online (Sandbox Code Playgroud)
也var next: (A, A) = ((null: A), n)失败了同样的错误.
不知怎的,我认为它应该编译.
我目前正在使用以下代码,它似乎有效:
var next: (A, A) = (null.asInstanceOf[A], n)
Run Code Online (Sandbox Code Playgroud)
为什么不起作用?错误或功能?
阅读didiers之后回答问题很明显.我错过了null只能分配给AnyRef类型.对于我的问题,我选择制作元组(n,n)并使用布尔标志,无论第一个条目是否有效.根据应用程序Option可能是更好的解决方案.
Did*_*ont 12
可能是因为您的A参数类型不能保证为<:AnyRef.如果您打算传递null,它应该是.如果是这样,我会说功能
编辑.请参阅下面的Daniel的评论,解决方案是>:Null,请参阅AgileSteel的答案.
我不确定你要使用nulls 存档(除了运行时更多的NPE),但我建议你不要null在你的Scala代码中使用.Scala具有Option可以代替的类型null.所以在你的情况下,它看起来像这样:
var next: (Option[A], A) = (None, n)
Run Code Online (Sandbox Code Playgroud)
我发现这个代码更加清晰,而且它有很大的优势,是元组类型告诉其他人(和编译器)它的第一个元素不是一些A,但它或者是Some[A]或者None.
如果需要与使用的现有Java代码集成,则null可以尽快包装来自Java端的对象.你可以这样做:
var next: (Option[A], A) = (Option(getAFromSomeMethodThatCanReturnNull()), n)
Run Code Online (Sandbox Code Playgroud)
这个答案可能没有回答你原来的问题,但我希望它会有所帮助.
didierd是对的.如果你能够确保A <: AnyRef或A >: Null它将起作用.
scala> def createTuple[A >: Null](first: A, second: A) = (first, second)
createTuple: [A >: Null](first: A, second: A)(A, A)
scala> val next = creatTuple(null, "n")
next: (java.lang.String, java.lang.String) = (null,n)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1774 次 |
| 最近记录: |