scala compilation atmosphere

Scala: cómo resolver el error "El valor no es miembro de Nothing"



compilation atmosphere (1)

Este código de ejemplo se basa en las clases de Atmósfera, pero si alguien pudiera darme algunas ideas sobre lo que significa el error en general, creo que puedo encontrar una solución específica para Atmosphere ...

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

Después de la primera línea, bc debe contener un identificador para un objeto cuya definición de clase incluye el método broadcast (); de hecho, contiene varias variaciones sobrecargadas. Sin embargo, el compilador se ahoga en la segunda línea de código con lo siguiente: "la transmisión de valor no es miembro de Nothing"

¿Alguna idea / sugerencia sobre lo que estaría causando esto?

Gracias.

EDITAR: firma para [BroadcasterFactor]. Lookup: búsqueda abstracta de emisoras (identificación del objeto)

Nota: 1) esa es la versión de firma que he usado en el ejemplo, 2) es la firma de Java Inteface - mientras que getDefault () devuelve un objeto instanciado que implementa esa interfaz.

Solución: valor de conversión de tipo de fuerza:

val bc: Broadcaster = BroadcasterFactory.getDefault().lookup(_broadcasterId)


Nothing es el nombre del tipo. Es el subtipo de todos los otros tipos. No puede llamar a métodos desde Nothing sí, tiene que especificar el tipo exacto ( (bc: ExactType).broadcast(message) ). Nothing tiene instancias. Método que devuelve Nothing , en realidad, nunca devolverá el valor. Lanzará una excepción eventualmente.

Escriba inferencia

Definición de lookup :

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

en Scala esta definición se ve de esta manera:

def lookup[T <: Broadcaster](Object id): T

No hay un parámetro de tipo especificado en el método de lookup . En este caso, el compilador deducirá este tipo de parámetro como el tipo más específico - 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>

Puede especificar un tipo de parámetro como este:

val bc = BroadcasterFactory.getDefault().lookup[Broadcaster](_broadcasterId)

Proyecto de implementación

En el proceso de desarrollo, la lookup se puede "implementar" de esta manera:

def lookup(...) = ???

??? devuelve Nothing .

Debe especificar el tipo de resultado del método de lookup siguiente manera: def lookup(...): <TypeHere> = ... o tipo de bc : val bc: <TypeHere> = .