在以下代码中:
object example {
trait List[T] {
def isEmpty: Boolean
def head: T
def tail: List[T]
}
class Cons[T](val head: T, val tail: List[T]) extends List[T] {
def isEmpty: Boolean = false
}
class Nil[T] extends List[T] {
def isEmpty: Boolean = true
val head: Nothing = throw new NoSuchElementException("Nil.head")
val tail: Nothing = throw new NoSuchElementException("Nil.tail")
}
def nth[T](n: Int, xs: List[T]): T =
if (xs.isEmpty) throw new IndexOutOfBoundsException("Out of Bound")
else if (n == 0) xs.head
else nth(n - 1, xs.tail)
val list = new Cons(1, new Cons(2, new Cons(3, new Nil)))
nth(2,list) //should return 3
}
我试图定义一般特征List[T]
,以后我可以给它任何类型。我可以从它实现我的类,然后我定义了一个函数,它接受一个整数和一个列表,并返回位于第n个给定索引的元素。 val list = new Cons(1, new Cons(2, new Cons(3, new Nil)))
抛出NoSuchElementException
。我认为我的代码有一个根本问题,我可以搞清楚。
顺便说一句,我正在运行REPL.Thank你。</ p>
答案 0 :(得分:1)
请更正
中的以下内容val head: Nothing = throw new NoSuchElementException("Nil.head")
val tail: Nothing = throw new NoSuchElementException("Nil.tail")
到
def head: Nothing = throw new NoSuchElementException("Nil.head")
def tail: Nothing = throw new NoSuchElementException("Nil.tail")
答案 1 :(得分:1)
在Nil
中,您将head
和tail
定义为val
,因此这些语句会在您实例化Nil
时执行,从而导致错误。
将其更改为def head: Nothing = ...
和def tail: Nothing = ...