Scala Return 摘要 class

Scala Return abstract class

就像在 Java 中一样,我可以访问 scala 中子项的新参数,为什么我没有访问权限?

abstract class superclass

class class1(c: Int) extends superclass

class class2(a: String) extends superclass


def foo(i: Int): superclass ={
  if(i == 1){
    return new class1(1)
  }
  else {
    return new class2("as")
  }
}

val cla = foo(1)

cla.c ??

我该如何解决这个问题?

这里最大的问题是 class1 首先没有成员 c 所以即使这样也行不通:

val c1 = new class1(3)
c1.c // Error: value c is not a member of class1

c是构造函数的参数,但不是成员。

您可以通过将其设为 case class 来解决此问题,这确实使构造函数参数成为成员:

case class class1(c: Int) extends superclass

修复此问题后,您仍然无法从 superclass 的实例访问成员 c,因为 superclass 没有名为 c 的成员。 Java 就像 Scala 一样。所以不能直接访问foo的结果的成员c

但是您可以使用 match 计算出 superclass 的哪个子 class 被返回,像这样:

val cla = foo(1)

cla match {
  case class1(c) =>
    println(s"It is class1, c = $c")
  case class2(a) =>
    println(s"It is class2, a is $a")
  case _ =>
    println("It is some other class")
}

这将打印 "It is class1, c = 1",而将 foo(1) 更改为 foo(2) 将打印 "It is class2, a is as".

其他问题:Class 名称应以大写字母开头(不需要,但 match 会与小写 class 名称混淆),并且 return 关键字不是必需的,并不总是按照您预期的方式运行。