2014-11-11 2 views
4

Я вызываю метод Java от io.netty.bootstrap.BootStrap что имеет следующую подпись:Избегайте `Boolean.box`

public <T> B option(ChannelOption<T> option, T value) 

Я использую следующий код для вызова метода:

b.option(ChannelOption.SO_KEEPALIVE, true); 

И это не скомпилируется со следующей погрешностью:

Error:(57, 30) type mismatch; 
found : io.netty.channel.ChannelOption[Boolean] 
required: io.netty.channel.ChannelOption[Any] 
Note: Boolean <: Any, but Java-defined class ChannelOption is invariant in type T. 
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10) 
     b.option(ChannelOption.SO_KEEPALIVE, true); // (4) 
         ^

Я не совсем понимаю w это говорит, но я понимаю, что жалуется на получение логического значения, поскольку он был параметризован Any вместо Boolean. Так что я попытался следующий код и он работает :

b.option(ChannelOption.SO_KEEPALIVE, Boolean.box(true)); 

компилируется и работает. Есть ли способ сделать это красивее без вызова box?

Может ли кто-нибудь перевести эту ошибку компилятора?

спасибо.

+0

Для записи, когда вы отправляете сообщение в ML, вы должны указать, что вы перекрестно размещены в SO, чтобы избежать дублирования усилий. –

+0

Прошу прощения за это и поблагодарить вас за помощь. – simao

ответ

4

Java-дженерики инвариантны в scala, поэтому вы не можете пройти scala Boolean и иметь тип, как вы ожидали. Явно аннотирующий тип должен исправить это:

b.option[java.lang.Boolean](ChannelOption.SO_KEEPALIVE, true) 
+0

Не могли бы вы немного объяснить, что «дженерики Java являются инвариантными»? Или укажите мне ссылку, где я могу прочитать об этом. Спасибо – simao

+0

Вот хорошая запись: http://stackoverflow.com/questions/8481301/covariance-invariance-and-contravariance-explained-in-plain-english –

+1

Или аннотировать истину. https://groups.google.com/d/msg/scala-user/T93aNh6PYTA/_7wSBGT3phUJ –

Смежные вопросы