Scala-如何解决“值不是Nothing的成员”错误

mjk*_*mjk 5 scala compilation atmosphere

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

val bc = BroadcasterFactory.getDefault().lookup(_broadcasterId) 
bc.broadcast(message)
Run Code Online (Sandbox Code Playgroud)

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

关于什么原因的任何想法/建议?

谢谢。

编辑:[BroadcasterFactor] .lookup的签名:抽象的Broadcaster lookup(对象id)

注意:1)这是我在示例中使用的签名版本,2)它是Java Inteface签名-而getDefault()递归实现该接口的实例化对象。

解决方案:强制类型强制转换为值:

val bc: Broadcaster = BroadcasterFactory.getDefault().lookup(_broadcasterId)
Run Code Online (Sandbox Code Playgroud)

sen*_*nia 4

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

类型推断

的定义lookup

abstract public <T extends Broadcaster> T  lookup(Object id);
Run Code Online (Sandbox Code Playgroud)

在 scala 中这个定义看起来像这样:

def lookup[T <: Broadcaster](Object id): T
Run Code Online (Sandbox Code Playgroud)

方法中没有指定类型参数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>
Run Code Online (Sandbox Code Playgroud)

您可以像这样指定类型参数:

val bc = BroadcasterFactory.getDefault().lookup[Broadcaster](_broadcasterId) 
Run Code Online (Sandbox Code Playgroud)

实施草案

在开发过程中lookup可以这样“实现”:

def lookup(...) = ???
Run Code Online (Sandbox Code Playgroud)

???返回Nothing

您应该指定方法的结果类型,lookup如:def lookup(...): <TypeHere> = ...或类型bcval bc: <TypeHere> =