此示例代码基于 Atmosphere 类,但如果有人能让我了解错误的一般含义,我想我可以找出任何特定于 Atmosphere 的解决方案......
val bc = BroadcasterFactory.getDefault().lookup(_broadcasterId)
bc.broadcast(message)
在第一行之后,bc 应该包含一个对象的句柄,该对象的类定义包括方法 broadcast(( - 事实上,它包含几个重载变体。但是,编译器在第二行代码上阻塞了以下内容:"值广播不是 Nothing 的成员">
关于导致这种情况的原因的任何想法/建议?
谢谢。
编辑:[广播因素]的签名.查找: 摘要广播公司查找(对象 ID(
注意:1(这是我在示例中使用的签名版本,2(它是java Inteface签名 - 而getDefault((交还一个实现该接口的实例化对象。
解决方案:强制类型转换为值:
val bc: Broadcaster = BroadcasterFactory.getDefault().lookup(_broadcasterId)
Nothing
是类型名称。它是所有其他类型的子类型。你不能从Nothing
本身调用方法,你必须指定确切的类型((bc: ExactType).broadcast(message)
(。 Nothing
没有实例。方法,返回Nothing
实际上永远不会返回值。它最终会引发异常。
类型推断
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> =
。