在我的Scala代码中,我有一个数组Option[T],如下所示:
val items = Array.fill[Option[T]](10)(None)
Run Code Online (Sandbox Code Playgroud)
现在,我想从该数组中读取一个特定的项目; 如果没有设定,我想拥有null.但是当我这样做时items(desiredIndex).orNull,Scala编译器会对我大喊:
Error:(32, 34) Cannot prove that Null <:< T.
(items(desiredIndex).orNull).asInstanceOf[T]
Run Code Online (Sandbox Code Playgroud)
我不完全理解这个错误.我所理解的是,编译器无法推断出它null确实是一个有效值T(因为它不知道T将是什么).纵观实施,我应提供证据隐含的事实,null是一个有效的价值T:
@inline final def orNull[A1 >: A](implicit ev: Null <:< A1): A1 = this getOrElse ev(null)
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是:我怎样才能提供这样的证据?ev应该是什么类型,我该如何为它创建一个值?
按类型绑定:
scala> def f[T >: Null : ClassTag]: T = {
| val items = Array.fill[Option[T]](10)(None)
| items(0).orNull }
f: [T >: Null](implicit evidence$1: scala.reflect.ClassTag[T])T
scala> f[String]
res3: String = null
Run Code Online (Sandbox Code Playgroud)
Per Pedro:
scala> def f[T >: Null]: T = Array.fill[Option[T]](10)(None).apply(0).orNull
f: [T >: Null]=> T
Run Code Online (Sandbox Code Playgroud)