在Kotlin集合接口中调用add方法时出现未解决的引用错误
如果我使用Set接口引用并尝试调用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
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>