无法在Scala中创建包含null的元组

zig*_*tar 5 scala

以下代码无法编译:

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的答案.


ten*_*shi 6

我不确定你要使用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)

这个答案可能没有回答你原来的问题,但我希望它会有所帮助.


agi*_*eel 6

didierd是对的.如果你能够确保A <: AnyRefA >: 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)