gpt4 book ai didi

scala - 发现 Unit : required Int. 为什么错误不明显?

转载 作者:行者123 更新时间:2023-12-03 11:30:19 24 4
gpt4 key购买 nike

我有一个应该返回 Int 的方法。我试图理解为什么 Eclipse 不允许我编译它,即使在 if 语句中我看起来很明显我确实返回了一个 Int。有什么我很明显的遗漏吗?在继续编写更多代码之前,我试图了解 Scala 的这一方面。

这是方法:

def contains1(sfType: TokenType): Int = {
if (Tokens.KEYWORDS.contains(sfType)) {
val retVal = TokenTypes.RESERVED_WORD
}
}

Eclipse 在第 2 行提示 --- 'type mismatch;找到:所需单位:Int”
TokenTypes is - public abstract interface org.fife.ui.rsyntaxtextarea.TokenTypes and RESERVED_WORD is - public static final int RESERVED_WORD = 6;

我在这里读过这篇文章: found: Unit required: Int - How to correct this?并尝试在发布之前解决问题,但我仍然不知所措。

编辑:该方法应该返回一个 Int 并且我错误地输入了返回类型。我的问题还是一样。 Eclipse 仍然提示。

最佳答案

我先说明是什么类型Unit是,以防万一。即使您已经知道,其他有同样问题的人也可能不知道。

类型 Unit类似于 C 或 Java 中已知的 void .在这些语言中,这意味着“这不会返回任何内容”。然而,Scala 中的每个方法都会返回一个值。

为了弥补每个方法返回一些东西和没有任何有用的东西返回之间的差距,有 Unit .这种类型是 AnyVal ,这意味着它不会在堆上分配,除非它被装箱或者是对象上的字段类型。此外,它只有一个值,其文字是 () .也就是说,你可以这样写:

val x: Unit = ()

这样做的实际效果是,当一个方法“返回”时 Unit ,编译器实际上不必返回任何值,因为它已经知道该值是什么。因此,它可以实现返回 Unit 的方法。通过在字节码级别将它们声明为 void .

无论如何,如果你不想返回任何东西,你就返回 Unit .

现在让我们看看给出的代码。 Eclipse 说它返回 Unit ,而且,事实上,Eclipse 是正确的。但是,大多数人实际上会错误地使该方法返回 AnyValAny ,不是 Unit .有关示例,请参见以下代码段:
scala> if (true) 2
res0: AnyVal = 2

所以发生了什么事?那么,当 Scala 发现 if 时语句,它必须弄清楚它返回的类型是什么(在 Scala 中, if 语句也返回值)。考虑以下假设线:
if (flag) x else y

显然,返回的值将是 xy ,因此类型必须同时满足 xy会适合。一种这样的类型是 Any ,因为一切都有类型 Any .如果两者都 xy属于同一类型——比如说, Int -- 那么这也是一个有效的返回类型。由于 Scala 选择了最具体的类型,它会选择 IntAny .

现在,当您没有 else 时会发生什么?陈述?即使没有 else语句,条件可能为假——否则,使用 if 没有意义。 .在这种情况下,Scala 所做的是添加一个 else陈述。也就是说,它重写了 if像这样的声明:
if (true) 2 else ()

就像我之前说的:如果您没有任何东西可以退货,请返回 Unit !这正是发生的事情。由于两者 IntUnitAnyVal ,并鉴于 AnyValAny 更具体,该行返回 AnyVal .

到目前为止,我已经解释了其他人可能看到的内容,但没有解释问题中特定代码中发生的情况:
if (Tokens.KEYWORDS.contains(sfType)) {
val retVal = TokenTypes.RESERVED_WORD
}

我们已经看到 Scala 会像这样重写它:
if (Tokens.KEYWORDS.contains(sfType)) {
val retVal = TokenTypes.RESERVED_WORD
} else ()

我们还看到 Scala 会在两个可能的结果中选择最具体的类型。最后,Eclipse 告诉 use 返回类型是 Unit ,所以唯一可能的解释是这个类型:
  val retVal = TokenTypes.RESERVED_WORD

也是 Unit .这是完全正确的:在 Scala 中声明事物的语句具有类型 Unit .而且,顺便说一下,做作业。

正如其他人所指出的,解决方案是删除分配并添加 else语句也返回 Int :
def contains1(sfType: TokenType): Int =
if (Tokens.KEYWORDS.contains(sfType)) TokenTypes.RESERVED_WORD
else -1

(注意:我重新格式化了该方法以遵循 Scala 程序员中更常见的编码风格)

关于scala - 发现 Unit : required Int. 为什么错误不明显?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14205367/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com