Выражение на основе класса объекта в Scala - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь написать выражение на основе класса объекта.

case class Fork(left: CodeTree, right: CodeTree, chars: List[Char], weight: Int) extends CodeTree
case class Leaf(char: Char, weight: Int) extends CodeTree

val l1 = new Leaf('A', 1)
val l2 = new Leaf('B', 1)

val f1 = new Fork(l1, l2, List(l1.char, l2.char), l1.weight + l2.weight)

Я пробовал два метода, но у них есть проблемы.

Метод 1:

val w: Int = f1 match {

  case Fork(_, _, _, w) => println("I am a fork")
  case Leaf(_, w) => println("I am a Leaf")
}

Получена ошибка:

Error:(15, 8) constructor cannot be instantiated to expected type;
found   : Leaf
required: Fork
case Leaf(_, w) => {w}

Метод 2:

if (l1.isInstanceOf[Fork]) println("I am a fork") else println("I am a leaf")

Получено предупреждение:

Warning:(10, 20) fruitless type test: a value of type Leaf cannot also be a Fork
if (l1.isInstanceOf[Fork]) println("I am a fork") else println("I am a leaf")

1 Ответ

1 голос
/ 28 мая 2020
  1. Это просто предупреждение, потому что компилятор знает, что f1 всегда является вилкой, и сообщает вам, что вы в основном делаете if (true)
  2. Код, который будет работать для вас:
val f1: CodeTree = new Fork(l1, l2, List(l1.char, l2.char), l1.weight + l2.weight)

val w = f1 match {
   case f: Fork => println("I am a fork")
   case l: Leaf => println("I am a Leaf")
}
  • Я добавил аннотацию от f1 к CodeTree type
  • Я удалил аннотацию w

, затем вы можете изменить на что угодно:

val w = f1 match {
   case f: Fork => f.weight 
   case l: Leaf => l.weight
}
...