Object) ActiveLecture.org Warm-up exercise: Explain the wildcard in the Collections.fill method.
[] instead of <>, e.g.
Array[T]trait TreeSet[T <: Ordered[T]]T must be a subtype of Ordered[T]<T extends Comparable<T>> in JavaString does not implement Scala
Ordered[String]String to
RichString which does<% instead of <: if you want to allow
conversionsT <% Ordered[T] means that T must be
convertible to a subtype of Ordered[T]G[S] and G[T]Array[Employee] and
Array[Person]class List[+T]
Now List[Employee] <: List[Manager]
G[+T] means that S <:
T ⇒ G[S] <: G[T]trait Comparable[-T]
abstract class List[+T] {
def isEmpty : Boolean
def head : T
def tail : List[T]
}
case class EmptyList[T]() extends List[T] {
override def isEmpty : Boolean = true
override def head = error("No head")
override def tail = error("No tail")
}
case class NonEmptyList[T](hd : T, tl : List[T]) extends List[T] {
override def isEmpty : Boolean = false
override def head = hd
override def tail = tl
}
scala> val foo = NonEmptyList("foo", EmptyList[String]())
foo: NonEmptyList[String] = NonEmptyList(foo,EmptyList())
scala> val bar = NonEmptyList(1, foo)
bar: NonEmptyList[Any] = NonEmptyList(1,NonEmptyList(foo,EmptyList()))
? extends T allows loads and blocks
storesclass BadStack extends Stack[Double] {
override def push(e : Double) = { super.push(Math.sqrt(e)) }
}
BadStack <: Stack[Double]BadStack[Double] <: Stack[AnyRef]? It better not be:
Stack[AnyRef] bad = new BadStack();
bad.push("Yikes!"); // calls Math.sqrt("Yikes!")
Ex. Can't have parameters of covariant T
class Stack[+T] {
def pop() : T = ... // OK
def push(newValue : T) { ... } // ERROR--T is parameter type
def isEmpty = ...
}
push variance problem by making push
into a generic methodclass Stack[+T] {
def push[N :> T](newValue : N) : Stack[N] = new NonEmptyStack[N](newValue, this)
...
}
push (parameter
is N) push in BadStack