2013-11-30 4 views
1

Я прохожу через «Программирование в Scala» и собираюсь вместе с примерами. Кажется, я застрял в главе 10, где мы делаем подклассы из абстрактного класса.Подкласс, не расширяющий абстрактный класс

Я не могу понять, почему мой код не будет компилироваться; похоже, что ArrayElement автоматически должен быть типом элемента?

Код:

abstract class Element { 
    def contents: Array[String] 
    def height: Int = contents.length 
    def width: Int = if (height == 0) 0 else contents(0).length 
    def above(that: Element): Element = 
     new ArrayElement(this.contents ++ that.contents) 
    def beside(that: Element): Element = 
     new ArrayElement(
      for (
       (line1, line2) <- this.contents zip that.contents 
      ) yield line1 + line2 
     ) 
    override def toString: String = contents mkString "\n" 
} 

class ArrayElement(
    val contents: Array[String] 
) extends Element 

Ошибка:

<console>:16: error: type mismatch; 
found : ArrayElement 
required: Element 
       new ArrayElement(this.contents ++ that.contents) 
      ^
<console>:18: error: type mismatch; 
found : ArrayElement 
required: Element 
       new ArrayElement(
      ^

Спасибо!

ответ

1

Это должно сработать. Похоже, вы используете REPL.

Это не будет работать при вводе в REPL обычно из-за рекурсивной зависимости между вашими двумя классами. Вам нужно будет использовать: вставить режим, например:

:paste 

abstract class Element { 
    def contents: Array[String] 
    def height: Int = contents.length 
    def width: Int = if (height == 0) 0 else contents(0).length 
    def above(that: Element): Element = 
     new ArrayElement(this.contents ++ that.contents) 
    def beside(that: Element): Element = 
     new ArrayElement(
      for (
       (line1, line2) <- this.contents zip that.contents 
      ) yield line1 + line2 
     ) 
    override def toString: String = contents mkString "\n" 
} 

class ArrayElement(
    val contents: Array[String] 
) extends Element 

Затем нажмите клавиши Ctrl и D вместе.

+0

Эй, Робин, у меня были ошибки, когда я использовал: load. Я пробовал: вставить, и он все еще жаловался! На самом деле, попробовал еще раз, и все получилось. Благодаря! –

+0

ОК, попробуйте вместо этого скалак. Возможно, REPL не справляется с рекурсивными зависимостями. –

+0

Я нашел ответ от 2010 года, говоря, что он не может использовать рекурсивные зависимости: http://stackoverflow.com/questions/3663865/what-are-the-limitations-and-walkarounds-of-scala-interpreter Позвольте мне знать, если scalac работает, и я исправлю свой ответ. –

Смежные вопросы