Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Kotlin集合接口中调用add方法时出现未解决的引用错误_Kotlin - Fatal编程技术网

在Kotlin集合接口中调用add方法时出现未解决的引用错误

在Kotlin集合接口中调用add方法时出现未解决的引用错误,kotlin,Kotlin,如果我使用Set接口引用并尝试调用add方法,则会出现未解决的引用错误: fun main(args : Array<String>) { val set = HashSet<Integer>() set.add(Integer(1)) //OK val seti : Set<Integer> = HashSet<Integer>() seti.add(Integer(2)) //FAILING: Unreso

如果我使用Set接口引用并尝试调用add方法,则会出现未解决的引用错误:

  fun main(args : Array<String>) {
    val set = HashSet<Integer>()
    set.add(Integer(1)) //OK

    val seti : Set<Integer> = HashSet<Integer>()
    seti.add(Integer(2)) //FAILING: Unresolved reference to add**
  }
fun main(args:Array){
val set=HashSet()
set.add(整数(1))//确定
val seti:Set=HashSet()
seti.add(整数(2))//失败:要添加的未解析引用**
}
我不理解那种行为。Java Set接口有一个add方法,我希望Kotlin one是一个扩展版本,而不是方法更少

PD1:我在Idea IDE或gradle的构建中也遇到了同样的错误。
PD2:使用kotlin 1.0.0-beta-4584将Java的
Set
接口分为两个接口:
Set
MutableSet
。后一个接口声明了变异方法,比如您正在寻找的
add
方法


通常,像
MutableSet
这样的接口扩展了
Set
接口,像
HashSet
这样的实现实现了
MutableSet
接口。然后,可以使用
Set
接口传递只读实例,以帮助避免常见错误的发生。

有关代码的一些说明,请参阅
Set
接口以及出现编译器错误的原因此答案仅供参考:

首先,您可以使用
hashSetOf()
函数而不是
HashSet
构造函数,尽管使用构造函数很好,但并不常见

val mySet = hashSetOf<Int>()
如果您想在将集合的构建包装到构造中并返回只读接口时初始化集合,那么您有很多选项。其中一些是:

val mySet: Set<Int> = hashSetOf<Int>().apply  {
    // do logic that adds to set (`this` is the set)
} 
val mySet:Set=hashSetOf().apply{
//添加到集合的do逻辑(`this`是集合)
} 
或:

val mySet:Set=run{
val tempSet=hashSetOf()
//执行添加到集合的逻辑
临时
}
或:

val mySet=someFunc()
fun someFunc():设置{
val tempSet=hashSetOf()
//执行添加到集合的逻辑
返回温度
}
有关功能,请参见文档:、和

我在自己的库中有一个相当无用的扩展函数,它可以清楚地说明何时需要只读接口,因为强制转换会产生警告,并且我并不总是希望在声明中指定冗余类型。为了可读性,它是一个扩展:

@Suppress("USELESS_CAST")
fun <T: Any> MutableSet<T>.readonly(): Set<T> = this as Set<T>
@Suppress(“无用的施法”)
fun MutableSet.readonly():Set=此为集合
用法是:

val mySet = hashSetOf<Int>().apply {
    // logic that builds the set
}.readonly() 

// inferred type of mySet is Set<Int>
val mySet=hashSetOf().apply{
//构建集合的逻辑
}.readonly()
//已设置mySet的推断类型
val mySet = someFunc()

fun someFunc(): Set<Int> {
   val tempSet = hashSetOf<Int>()
   // do logic that adds to set
   return tempSet
}
@Suppress("USELESS_CAST")
fun <T: Any> MutableSet<T>.readonly(): Set<T> = this as Set<T>
val mySet = hashSetOf<Int>().apply {
    // logic that builds the set
}.readonly() 

// inferred type of mySet is Set<Int>