Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

scala f-bounded types explanation

After going through a few examples, I have to say, I fail to understand what the F-Bounded polymorphic brings.

To use the example from scala school (https://twitter.github.io/scala_school/advanced-types.html#fbounded)

They explain that they need some F-Bounded type so that the subclass can return the subtype. So they do something like this:

trait Container[A <: Container[A]] extends Ordered[A]
class MyContainer extends Container[MyContainer] {
  def compare(that: MyContainer) = 0
}

But I don't see what is the gain of using this kind of type when you could use something like this:

trait Container[A] extends Ordered[A]
class MyContainer extends Container[MyContainer] {
  def compare(other: MyContainer) = 0
}

Any explanation is very welcomed

Thanks

like image 882
jeremie Avatar asked Mar 30 '15 06:03

jeremie


2 Answers

The advantage would come when it looks something like this:

trait Container[A <: Container[A]] extends Ordered[A] {
  def clone: A
  def pair: (A, A) = (clone, clone)
}

class MyContainer extends Container[MyContainer] {
  def clone = new MyContainer
}

Now you get pair for free, and you get the correct return type. Without something like this you must manually override every single method that returns the same type (lots of pointless boilerplate), or you lose specificity in your types as soon as you call a non-overridden method.

like image 121
Rex Kerr Avatar answered Oct 22 '22 01:10

Rex Kerr


In Scala you can make your type parameters constrained by a type bound. Here in your first method you are making your type parameter making upper bound with sub class of Container.

By using your 1st method you can't pass parameter in Container class which is not sub class of your Container class.

In your 2nd example you can pass parameter type instance of any class. So here your are not restricting anything while in 1st example you are restricting type sub type of Container class.

like image 36
Nishan Avatar answered Oct 22 '22 01:10

Nishan