summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Zenger <mzenger@gmail.com>2003-07-10 01:10:58 +0000
committerMatthias Zenger <mzenger@gmail.com>2003-07-10 01:10:58 +0000
commit09ad15e15ab458c363f0ed6dc1c49786547fc988 (patch)
tree953d810d4bcf5ae29e39e541a44d2a74d0f55249
parent4df9f3a89b036237b41a98c93d9bfd7c1fd56a01 (diff)
downloadscala-09ad15e15ab458c363f0ed6dc1c49786547fc988.tar.gz
scala-09ad15e15ab458c363f0ed6dc1c49786547fc988.tar.bz2
scala-09ad15e15ab458c363f0ed6dc1c49786547fc988.zip
Turned the stack class into a covariant datatype.
-rw-r--r--sources/scala/collection/immutable/Stack.scala26
1 files changed, 13 insertions, 13 deletions
diff --git a/sources/scala/collection/immutable/Stack.scala b/sources/scala/collection/immutable/Stack.scala
index b1aff18e5d..5a8e7972d2 100644
--- a/sources/scala/collection/immutable/Stack.scala
+++ b/sources/scala/collection/immutable/Stack.scala
@@ -22,7 +22,7 @@ object Stack {
* @author Matthias Zenger
* @version 1.0, 10/07/2003
*/
-class Stack[A] with Seq[A] {
+class Stack[+A] with Seq[A] {
/** Checks if this stack is empty.
*
@@ -41,7 +41,7 @@ class Stack[A] with Seq[A] {
* @param elem the element to push on the stack.
* @returns the stack with the new element on top.
*/
- def +(elem: A): Stack[A] = new Node(elem);
+ def +[B >: A](elem: B): Stack[B] = new Node(elem);
/** Push all elements provided by the given iterable object onto
* the stack. The last element returned by the iterable object
@@ -50,8 +50,8 @@ class Stack[A] with Seq[A] {
* @param elems the iterable object.
* @returns the stack with the new elements on top.
*/
- def +(elems: Iterable[A]): Stack[A] = {
- var res = this;
+ def +[B >: A](elems: Iterable[B]): Stack[B] = {
+ var res: Stack[B] = this;
elems.elements.foreach { elem => res = res + elem; }
res;
}
@@ -62,7 +62,7 @@ class Stack[A] with Seq[A] {
* @param elems the element sequence.
* @returns the stack with the new elements on top.
*/
- def push(elems: A*): Stack[A] = this + elems;
+ def push[B >: A](elems: B*): Stack[B] = this + elems;
/** Returns the top element of the stack. An error is signaled if
* there is no element on the stack.
@@ -114,17 +114,17 @@ class Stack[A] with Seq[A] {
*/
override def hashCode(): Int = 0;
- // Here comes true magic: lists with implicit tail references
+ // Here comes true magic: covariant lists with implicit tail references
- protected class Node(elem: A) extends Stack[A] {
+ protected class Node[+B >: A](elem: B) extends Stack[B] {
override def isEmpty: Boolean = false;
override def length: Int = Stack.this.length + 1;
- override def +(elem: A): Stack[A] = new Node(elem);
- override def +(elems: Iterable[A]): Stack[A] = super.+(elems);
- override def top: A = elem;
- override def pop: Stack[A] = Stack.this;
- override def apply(n: Int): A = if (n > 0) Stack.this(n - 1) else elem;
- override def toList: List[A] = elem :: Stack.this.toList;
+ override def +[C >: B](elem: C): Stack[C] = new Node(elem);
+ override def +[C >: B](elems: Iterable[C]): Stack[C] = super.+(elems);
+ override def top: B = elem;
+ override def pop: Stack[B] = Stack.this;
+ override def apply(n: Int): B = if (n > 0) Stack.this(n - 1) else elem;
+ override def toList: List[B] = elem :: Stack.this.toList;
override def hashCode(): Int = elem.hashCode() + Stack.this.hashCode();
}
}