2016-07-26 55 views
-1

我想從一些科特林代碼調用Java方法從科特林與列表參數

val list: List<String> = emptyList() 
repository.find(list) // this call goes to a java class 

的IntelliJ被告知我有關類型不匹配調用Java方法:

類型不匹配。
必需:(Mutuable)設置<字符串! >
發現:名單<字符串>

我的方法在Java中的簽名:

void find(@Nonnull Set<String> list); 

我明白,這不能順利和according to the doc,我可以在科特林使用MutableList代替。但是我也完全控制了Java代碼,並且希望將Java代碼更改爲與Kotlin的列表一起使用。

Java方法簽名如何接受Kotlin的列表?

順便說一句:是IntelliJ告訴我Required: (Mutuable)Set<String!>?什麼是感嘆號?

+3

一個'Set'不一個'List',反之亦然。這很清楚。 – rmlan

+0

它是「可變的」,而不是「可變的」,和字符串!意味着它是一種平臺類型。見http://stackoverflow.com/questions/27460536/kotlin-what-is-kotlin-string-type –

+0

感謝您的快速解答!這是一個愚蠢的問題,我只是混合了Set和List類型。 – linqu

回答

5

如果你真的想用一個列表中,您需要更改您的Java方法的簽名:

void find(@Nonnull List<String> list); 

在另一方面,你可以改變你變量的聲明中科特林:

val set: Set<String> = emptySet() 
repository.find(set) 

或每雅各布鮑耶的評論和答案,你可以讓科特林推斷參數類型:

val set = emptySet<String>() 
repository.find(set) 
+0

將泛型放入函數調用並讓kotlin推斷類型更爲常見。 –

+0

@JakobBowyer - 很高興知道。我還沒有玩過Kotlin,所以這只是脫離了純JVM類型安全知識。 – rmlan

1

爲什麼不 val list = emptySet<String>() repository.find(list) // this call goes to a java class

0

如果你有List並希望將它傳遞給(JAVA)函數採取Set,您可以將列表轉換與toSet擴展功能:

repository.find(list.toSet())