Scala上下类型绑定

时间:2017-10-08 16:54:28

标签: scala generics

我在scala中找不到同时施加上下类型绑定的方法。我需要创建一个泛型函数,其中type参数是hashable(AnyRef的子类型)和nullable(超类型的Null)。

我可以像这样实现前者:

def foo[T <: AnyRef](t: T) = ???

后者是这样的:

def bar[T >: Null)(t: T) = ???

我有办法同时做两件事吗?感谢。

2 个答案:

答案 0 :(得分:4)

这个怎么样?

  val nameMatcherFunct = (nm: String, ca: Int, cb: Int, cc: Int) => {
  val value = nm match {
    case "a" => ca
    case "b" => cb
    case "c" => cc
  }
  if (value > 0) 1 else 0
}

def purchaseValueUDF = udf(nameMatcherFunct)

val result = a.withColumn("p", purchaseValueUDF(col("nm"), col("ca"), col("cb"), col("cc")))

它应该工作。那就是:

def foo[T >: Null <: AnyRef](t: T) = ???

答案 1 :(得分:1)

任何属于AnyRef子类的类型都可以赋值null,因此您不需要上限。

def foo[T <: AnyRef](x: T) = x
foo(null) // returns null

也就是说,由于您需要能够对值进行哈希处理,因此请注意,如果您尝试取消引用null(例如null.hashCode),您将获得NullPointerException。例如:

def foo[T <: AnyRef](x: T) = x.hashCode
foo(null) // Throws an NPE

此外,强烈建议不要在 Scala 程序中使用null。考虑到所有这些,我认为您可能真正想要的是这样的,适用于任何类型:

def foo[T](x: Option[T]) = x.hashCode
def foo(None) // Works. None is equivalent to no value (and Option(null) == None).
def foo(Some(1)) // Works. Note an Int isn't an AnyRef or nullable!
def foo(Some("Hello, world!")) // Works
def foo(Option(null)) // Works.
def foo(Option(z)) // Works, where z can be any reference type value, including null.

Option[T]是处理未定义值的函数方法(例如可空类型),它适用于任何类型T