2016-07-26 61 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())