2013-08-02 2 views
4

Этот примерный код основан на классах Атмосферы, но если кто-то может дать мне некоторое представление о том, что означает ошибка в целом, я думаю, что могу выяснить любая атмосфера-конкретное решение ...Scala - как решить проблему «Значение не является членом Nothing» error

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

После первой линии, BC должен содержать дескриптор объекта, чье определение класса включает в себя метод трансляции() - на самом деле, он содержит несколько перегруженных вариантов. Однако компилятор вторгается во вторую строку кода со следующим: «value broadcast не является членом Nothing»

Любые идеи/предложения по поводу того, что может быть причиной этого?

Спасибо.

РЕДАКТИРОВАТЬ: подписи для [BroadcasterFactor] .lookup: абстрактного Транслятор поиска (идентификатор объекта)

Примечание: 1), что является версией подписи, которые я использовал в примере 2) она является Java Интегральная подпись - тогда как getDefault() возвращает обратно экземпляр объекта, который реализует этот интерфейс.

Решение: тип силы бросить на значение:

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

Можете ли вы опубликовать подпись метода 'lookup' в строке 1. Это, вероятно, где проблема. Он возвращает «Ничего», а не то, что имеет метод «broadcast». – rjsvaljean

ответ

4

Nothing это имя типа. Это подтип всех других типов. Вы не можете вызывать методы от Nothing, вам нужно указать точный тип ((bc: ExactType).broadcast(message)). Nothing не имеет экземпляров. Метод, который возвращает Nothing, на самом деле никогда не вернет значение. В конце концов, это исключит исключение.

Тип умозаключение

Definition of lookup:

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

в Скале это определение выглядит следующим образом:

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> =.

+0

Да, действительно. Это сводилось к компилятору, просто не создавая правильного вывода класса. Я бы не догадался - спасибо! – mjk

+0

@mjk: java Inteface не может возвращать 'Nothing' без параметра типа. Вы уверены, что нет параметров типа в 'getDefault' или' lookup'? Я обновил свой ответ. – senia

+0

Чтобы быть совершенно откровенным, я не уверен ни в чем, когда дело доходит до библиотеки Atmosphere. Я боролся за его интеграцию в течение недели, и я нахожусь в состоянии счастья. Это говорит о том, что я вырыл это из исходных файлов библиотеки: публичный окончательный поиск в Broadcaster (Object id), который, в свою очередь, делает более надежным вызовите одно из других переопределений. Одна вещь, которая меня сбила с толку, заключалась в невозможности объединить эти звонки, но мой ограниченный опыт работы с Scala не поставил меня в отличную позицию, чтобы рассказать вам гораздо больше. Еще раз спасибо. -cheers – mjk