当前位置: 首页 > 知识库问答 >
问题:

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

陶宜民
2023-03-14

如果我使用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**
  }

我不理解那种行为。Java Set接口有一个add方法,我希望Kotlin one是一个扩展版本,而不是方法更少。

PD1:我在Idea IDE或gradle的构建中也遇到了同样的错误。PD2:使用kotlin 1.0。0-β-4584

共有2个答案

通煜祺
2023-03-14

关于您的代码的一些注释,请参阅@nhaarman关于Set接口和编译器错误原因的回答。此答案仅供参考:

首先,您可以使用hashSetOf()函数来代替HashSet构造函数,尽管使用构造函数很好,只是不太常见。

val mySet = hashSetOf<Int>()

您应该使用Int而不是Integer。您没有收到编译器警告,因为您应该让Kotlin决定何时讨论IntLongByte等的原语或类。不要忽略该警告。文档中映射类型的表可能不清楚它是否适用于同一类型的基元和装箱版本,除非您需要基元数组,否则不要担心使用的是哪个基元数组。

不要实例化整数类,例如调用整数(1)Int(1)的代码。取而代之的是,使用类似以下代码的东西——它让静态编程语言为你打包:

val mySet1 = hashSetOf(1, 2, 3) // makes a HashSet<Int> which in Java is HashSet<Integer>

val mySet2 = hashSetOf<Int>()   // makes a HashSet<Int> which in Java is HashSet<Integer>
mySet2.add(1)
mySet2.add(2)
mySet2.add(3)

如果您想初始化一个集合,同时将集合的构建打包到构建中并返回只读接口,那么您有很多选择。其中一些是:

val mySet: Set<Int> = hashSetOf<Int>().apply  {
    // do logic that adds to set (`this` is the set)
} 
val mySet: Set<Int> = run  {
    val tempSet = hashSetOf<Int>()
    // do logic that adds to set
    tempSet
}

或:

val mySet = someFunc()

fun someFunc(): Set<Int> {
   val tempSet = hashSetOf<Int>()
   // do logic that adds to set
   return tempSet
}

有关函数,请参阅文档:应用()、let()、run()和with()

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

@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>
欧阳翔
2023-03-14

静态编程语言将Java的Set接口分为两个接口:Set和MutableSet。后一个接口声明了变异方法,例如您正在寻找的add方法。

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

 类似资料:
  • 我正在做一个静态编程语言Java混合项目。 Gradle版本和插件最近分别升级到3.1.3和4.4。 现在,在编译时,我在一些Kotlin文件中发现了一个错误“未解析引用”。 例如:- 在上面的代码得到编译错误在android. r.id.home作为未解决的参考。 也在 在查找“removeOnGlobalLayoutListener”时获取“unresolved reference”错误 这件

  • 我想把我的项目分成几个子项目。IntelliJ IDE的默认渐变设置为: 这种设置可以编译。但我不想在每个子项目中重复这些代码。所以我改变了结构。格雷德尔。kts至 但我有例外: e:C:[…]\建造。格雷德尔。kts:1:12:未解析引用:jetbrains e:C:[…]\建造。格雷德尔。kts:16:9:未解析引用:实现e:C:[…]\建造。格雷德尔。kts:19:20:未解析引用:Kotl

  • 问题内容: 我在Java中有以下情形。假设我有一个接口,以及两个实现此接口的类。如下: 公共接口myInterface { } 公共类A实现myInterface { } 公共类B实现myInterface { } 如果定义如下,如何调用上面的printOtherStuff方法: 上面的调用代码似乎无效。有任何想法吗? 问题答案: 的参考类型为。这意味着您只能访问接口中定义的方法。您可以将其强制类

  • 我将gradle文件从Groovy迁移到kotlin dsl。一切都很好,但是有一个问题是从另一个kotlin文件中修改值。我可以导入变量和自动完成只是工作很好,但当我构建项目时,它给我提供了未解决的引用错误。感谢任何帮助。 Gradle版本:7.1.1

  • 本文向大家介绍解决vue中使用Axios调用接口时出现的ie数据处理问题,包括了解决vue中使用Axios调用接口时出现的ie数据处理问题的使用技巧和注意事项,需要的朋友参考一下 1.问题 近期在使用vue2 + axios 调用接口时碰到一个IE中很奇葩的问题,让我头痛了很久。 废话不多扯,就是在其他浏览器中调用接口返回数据然后可以很顺利的进行处理,但在IE(9-11)中发现发送请求是成功的而且

  • 我是kotlin的新手,我总是编写java。我尝试了kotlin以java方式编写的一些函数代码,但不起作用。 我将这些代码翻译成java,它就可以工作了。 即使FInter是java接口。它也不起作用。 使现代化 我尝试了一些不同的方法,现在它们都是工作。