Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scala upper and lower type bound

Tags:

generics

scala

I'm having trouble finding a way in scala to simultaneously impose an upper and lower type bound. I need to make a generic function where the type parameter is both hashable (subtype of AnyRef) and nullable (supertype of Null).

I could achieve the former like this:

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

And the latter like this:

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

Is there a way that I can do both simultaneously? Thanks.

like image 576
Phoenix Avatar asked Nov 01 '25 11:11

Phoenix


2 Answers

What about this?

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

It should work. That is:

foo(42) // does not compile 
foo(null) // compiles
foo("hello") // compiles
like image 62
lambdista Avatar answered Nov 04 '25 06:11

lambdista


Any type that is a subclass of AnyRef can be assigned the value null, so you do not need the upper bound.

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

That said, since you need to be able to hash the value, it should be noted that if you attempt to dereference null (e.g. null.hashCode) you will get a NullPointerException. For example:

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

Furthermore, any use of null in Scala programs is strongly discouraged. Bearing all that in mind, I think what you might really want is something like this, which works for any type:

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] is a functional means of dealing with undefined values (such as nullable types), and it works for any type T.

like image 28
Mike Allen Avatar answered Nov 04 '25 06:11

Mike Allen



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!