2015-11-19 19 views
9

Tip kısıtlamaları nedeniyle Void parametresini iletmem gereken bir Java işlevim var. Ben KOTLIN gelen bu işlevi çağırmak istiyorum, ama derleyici ı Java yaptığınız gibi ben null ile çağırdığınızda türleri uyumlu olmadığını şikayet ŞimdiKotlin'de Java Void türünü kullanma

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

:

foo(null); 

şey gibi Kotlin derleyicisinin kabul ettiği şekilde bu işleve geçmek için ne yapmalıyım?

Güncelleme: gerçek kod şuna benzer:

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

Güncelleme:null as Void kullanarak aslında ya çalışmaz: senin Kotlin eklentisi güncellemek için

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

sen trie var d değişkeni elden önce null olarak mı ayarlıyorsunuz? İşlev bir INT veya OBJECT kullanıyor mu? Eğer öyleyse, denemeye ya da değiştirmeye ya da değiştirmeye başlamadan önce onu NULL olarak ayarlayabilir. Bu, aradığınız veya başka bir sınıftan miras aldığınız bir yöntem mi? – colt

+0

aslında “Map ” i döndürmesi gereken bir işlevi miras alıyorum ve 'return mapOf (Çift (" foo ", null))) – TBieniek

+0

Derleyici tarafından verilen tam hata iletisi nedir? Problemi izole bir örneklemde yeniden üretemedim, yani bir "Void" parametresine " –

cevap

3

deneyin. Ben '1.0.0-beta-1103-IJ143-27' çıkıyorum ve aşağıdaki kodu herhangi bir şikayet/Uyarılar olmadan derler: Aşağıdaki yerlerde de tamamen

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

    } 
} 

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

benim eklenti aslında daha güncel: '1.0.0-beta-2423-IJ143-13' ama sorun hala devam ediyor – TBieniek

+0

Aga (' 1.0.0-beta-1103- ile aynı eklenti sürümü var IJ143-27'). IntelliJ IDEA Community Edition 15.0.1 kullanıyorum ve aga tarafından yayınlanan kod çevremde çalışıyor. – Eric

6

denemek için bir şans içmedim, ama esaslı aşağıdaki kod çalışması gerekir istisna:

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

Açıklama: Map<String, Void> hiçbir null değerleri olacaksa bekliyor. Ancak, null değeriyle Pair oluşturuyorsunuz. İnsanlar, bildiğim kadarıyla çalışması gereken Void ile java yöntemini çağırmayı önerdiler, ancak kullandığınız Pair yapıcısı için kesinlikle Map null değerlerini içerebileceğini açıkça belirtmeniz gerekir.

Düzenleme: necro-ing için kötü, tarih kadar sonra düşünmedim. :(

+1

Bu kabul edilen cevap olmalı. Null geçmek istiyorsanız kesinlikle null bir tür kullanın. – Rocoty

+0

Bu, kotininlerin ele alması gereken bir özel durum. Void türü her zaman boş olacaktır – jontro

0

ben 2 çözümleri, ikisi de (KOTLIN 1.1.2-3 altında) derler ile geldi etmişti

Sen (yöntem imzası değişmiyor ama çalışmıyor) bu gerekebilir.:

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

Veya (imzanızı değişen ve o inşaat) gibi bir şey.

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

İyi şanslar

İlgili konular