gpt4 book ai didi

Scala - 如何解决 "Value is not a member of Nothing"错误

转载 作者:行者123 更新时间:2023-12-04 20:10:29 25 4
gpt4 key购买 nike

此示例代码基于 Atmosphere 类,但如果有人可以让我了解错误的一般含义,我想我可以找出任何特定于 Atmosphere 的解决方案......

val bc = BroadcasterFactory.getDefault().lookup(_broadcasterId) 
bc.broadcast(message)

在第一行之后, bc 应该包含一个对象的句柄,该对象的类定义包含方法 broadcast() —— 事实上,它包含几个重载的变体。但是,编译器在第二行代码中阻塞了以下内容:“值广播不是 Nothing 的成员”

关于导致这种情况的任何想法/建议?

谢谢。

编辑: [BroadcasterFactor].lookup 的签名:
抽象广播者查找(对象 id)

注意:1)这是我在示例中使用的签名版本,2)它是 java 接口(interface)签名 - 而 getDefault() 交还一个实现该接口(interface)的实例化对象。

解决方案:强制类型转换值:
val bc: Broadcaster = BroadcasterFactory.getDefault().lookup(_broadcasterId)

最佳答案

Nothing是类型名称。它是所有其他类型的子类型。您不能从 Nothing 调用方法本身,您必须指定确切的类型( (bc: ExactType).broadcast(message) )。 Nothing没有实例。方法,返回 Nothing实际上,永远不会返回值。它最终会抛出异常。

类型推断

Definition of lookup :

abstract public <T extends Broadcaster> T  lookup(Object id);

在 scala 中,这个定义看起来是这样的:
def lookup[T <: Broadcaster](Object id): T
lookup 中没有指定类型参数方法。在这种情况下,编译器会将此类型参数推断为最具体的类型 - Nothing :
scala> def test[T](i: Int): T = ???
test: [T](i: Int)T

scala> lazy val x = test(1)
x: Nothing = <lazy>

scala> lazy val x = test[String](1)
x: String = <lazy>

您可以像这样指定类型参数:
val bc = BroadcasterFactory.getDefault().lookup[Broadcaster](_broadcasterId) 

实现草案

开发中 lookup可以像这样“实现”:
def lookup(...) = ???
???返回 Nothing .

您应该指定任一结果类型 lookup像这样的方法: def lookup(...): <TypeHere> = ...bc 的类型: val bc: <TypeHere> = .

关于Scala - 如何解决 "Value is not a member of Nothing"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18008533/

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