OK, řešení č. 2, snad už projde přes komisi:
package casematrix {
abstract class Matrix(array: Array[Array[Double]]) {
  private val elements = array
  def toArray(): Array[Array[Double]] = {
    this.elements
  }
}
object Matrix {
  def newMatrix(array: Array[Array[Double]]) : Matrix = {
    if (array.length == array(0).length) new SquareMatrix(array)
    else new RectangleMatrix(array)
  }
  def multiply(first: Matrix, second: Matrix) = {
    newMatrix(first.toArray()) // dummy
  }
}
case class RectangleMatrix(array : Array[Array[Double]]) extends Matrix(array)
case class SquareMatrix(array : Array[Array[Double]]) extends Matrix(array) {
  def trace() : Float = {
    return 0; // dummy
  }
}
}
import java.lang.RuntimeException
import casematrix._
object MatrixCaseApp extends App {
  val m = Matrix.newMatrix(Array(Array(1.0, 2.0),Array(1.0, 2.0)))
  val n = Matrix.newMatrix(Array(Array(1.0, 2.0),Array(1.0, 2.0)))
  Matrix.multiply(m, n) match {
    case m @ SquareMatrix(_) => println(m.trace())
    case _ => println("Sorry, not a square matrix")
  }
}