在Java或Scala中,如何根据类型绑定是否满足来定义条件控制流?
In Java or Scala, how to define conditional control flow based on whether type bound is satisfied?
在 Scala 中,我有一个 class 定义:
class A[T >: Null]{}
以及一个可选择创建实例的函数:
def use[T](): Option[A[T]]
现在我想这样定义它:
- 如果条件
T >: Null
不满足returnsNone
- 满意returns一些[A[T]]
在这种情况下如何编写函数use
?
这是一种类型 class
的方法
def use[T]()(implicit sel: Selector[T]): sel.Out = sel.x
trait Selector[T] {
type Out
val x: Out
}
trait LowPrioritySelector {
implicit def default[T]: Selector[T] { type Out = None.type } = new Selector[T] {
override type Out = None.type
override val x: Out = None
}
}
object Selector extends LowPrioritySelector {
implicit def superTypeOfNull[T >: Null]: Selector[T] { type Out = Some[A[T]] } = new Selector[T] {
override type Out = Some[A[T]]
override val x: Out = Some(new A[T])
}
}
use[String]() // Some(App$A@34340fab)
use[Int]() // None
在 Scala 中,我有一个 class 定义:
class A[T >: Null]{}
以及一个可选择创建实例的函数:
def use[T](): Option[A[T]]
现在我想这样定义它:
- 如果条件
T >: Null
不满足returnsNone - 满意returns一些[A[T]]
在这种情况下如何编写函数use
?
这是一种类型 class
的方法def use[T]()(implicit sel: Selector[T]): sel.Out = sel.x
trait Selector[T] {
type Out
val x: Out
}
trait LowPrioritySelector {
implicit def default[T]: Selector[T] { type Out = None.type } = new Selector[T] {
override type Out = None.type
override val x: Out = None
}
}
object Selector extends LowPrioritySelector {
implicit def superTypeOfNull[T >: Null]: Selector[T] { type Out = Some[A[T]] } = new Selector[T] {
override type Out = Some[A[T]]
override val x: Out = Some(new A[T])
}
}
use[String]() // Some(App$A@34340fab)
use[Int]() // None