2015-11-19 3 views
9

У меня есть функция Java, которая требует от меня передать параметр Void из-за ограничений типа. Что-то вроде:Использование Java Void type в Kotlin

void foo(Void v) { 
    // do something 
} 

Теперь я хотел бы назвать эту функцию из Котлин, но компилятор жалуется, что типы не совместимы, когда я называю его null как я бы с Java:

foo(null); 

Что мне нужно передать этой функции, чтобы компилятор Kotlin принял ее?

Update: фактический код выглядит следующим образом:

fun foo(): Map<String, Void> { 
    return mapOf(Pair("foo", null)) 
} 

Update: с помощью null as Void фактически не работает, либо:

kotlin.TypeCastException: null cannot be cast to non-null type java.lang.Void 
+0

вы TRIE d установить переменную в значение null перед началом? Является ли функция, использующая INT или OBJECT? Если это возможно, установите его в NULL, прежде чем пытаться получить к нему доступ или изменить его. Это метод, который вы вызываете, или вы наследуете это от другого класса? – colt

+0

Фактически я наследую функцию, которая должна возвращать 'Map ' и хочет 'return mapOf (Pair (" foo ", null))' – TBieniek

+0

Каково точное сообщение об ошибке, данное компилятором? Я не смог воспроизвести проблему в изолированном образце, т. Е. Вы могли бы передать значение null в параметр «Void» –

ответ

3

Попробуйте обновить плагин Котлин. Я на «1.0.0-бета-1103-IJ143-27» и следующий код компилируется без каких-либо жалоб/предупреждений:

// On Java side 
public class Test { 
    public void test(Void v) { 

    } 
} 

// On Kotlin side 
fun testVoid() { 
    Test().test(null) 
} 
+1

мой плагин на самом деле еще более современный: '1.0.0-beta-2423-IJ143-13', но проблема по-прежнему сохраняется – TBieniek

+0

У меня такая же версия плагина, как и aga (' 1.0.0-beta-1103- IJ143-27'). Я использую 'IntelliJ IDEA Community Edition 15.0.1', а код, опубликованный aga, работает в моей среде. – Eric

6

не имели шанс попробовать его, но на основе исключительно на свой контекстуальный исключение следующий код должен работать:

fun foo(): Map<String, Void?> { 
    return mapOf(Pair("foo", null)) 
} 

Объяснение: Map<String, Void> ожидает не должно быть никаких null значения. Но вы создаете Pair с null. Люди предлагают использовать метод java, требующий Void с null, который должен работать, насколько мне известно, но для используемого конструктора Pair вам явно нужно явно указать, что Map может содержать нулевые значения.

Редактировать: my bad for necro-ing, не думал о дате до после. :(

+1

Это должен быть принятый ответ. Определенно используйте тип с нулевым значением, если вы хотите передать null. – Rocoty

+0

Это один специальный случай, который, как я думаю, должен обработать котлины. Тип Void всегда будет нулевым – jontro

0

я придумал 2 решения, оба из них компилирует (под Котлин 1.1.2-3)

Вам может понадобиться это (не изменив сигнатуру метода, но он не работает).:

fun foo(): Map<String, Void> { 
    return mapOf(Pair("foo", throw Exception("Why? Why you call me"))) 
} 

Или что-то подобное (изменение вашей подписи, и она работает.):

fun foo(): Map<String, Void?> { 
    return mapOf(Pair("foo", null as Void?)) 
} 

Успехов

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