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

Kotlin中是否有instanciable MutableList,避开java api?

狄天逸
2023-03-14

MutableList是一个接口,但我在kotlin包中找不到明确实现它的类。有吗?此外,我本以为是一个包范围定义的MutableListOf(varargs)与listargs(varargs)同步。到目前为止,我必须使用java集合。

共有3个答案

巫马正卿
2023-03-14

不,就集合而言,您无法避免使用 java API,因为每个 kotlin 集合都以某种方式使用相应的 java 集合。

Kotlin集合接口只是模拟接口,它们在运行时并不存在。因此,即使您有一个类在运行时实现了一些kotlin集合接口(例如MutableList),它也会使用相应的java接口。

例如,让我们编写两个kotlin类,分别实现kotlin的ListMutableList接口

abstract class KotlinList : List<Int>

abstract class KotlinMutableList : MutableList<Int>

当您反编译这些类时,它们的签名更改如下(抬头,前面的字节码)

public abstract class com/example/kotlin/KotlinList implements java/util/List kotlin/jvm/internal/markers/KMappedMarker

public abstract class com/example/kotlin/KotlinMutableList implements java/util/List kotlin/jvm/internal/markers/KMutableList

现在这两个类都实现了java.util.List接口,并且它们还分别实现了kotlin.jvm.internal.markers.KMappedMarker和kotlin.jvm.internal.markers.KMutableList接口,所以你可以看到kotlin接口已经消失了,我们留下了相同的旧java列表,你的方法调用现在将作为java.util.List.someMethod的地址,而不是一些kotlin接口。KMutableListKMappedMarker(顾名思义)是编译器使用的标记接口。

对于KotlinList类,如果你往里面看,你会看到java.util.List的所有突变方法都是为你生成的,看起来类似于下面的方法

   public boolean add(int var1) {
      throw new UnsupportedOperationException("Operation is not supported for read-only collection");
   }

所以正如你所看到的,没有办法避免java API,因为它们是kotlin集合的基础。

张承颜
2023-03-14

你是对的,java集合是获取MutableList的唯一方法

孟乐逸
2023-03-14

尝试使用mutableListOfarrayListOf

 类似资料:
  • 问题内容: 建议在HTML页面中使用表格(现在已经有了CSS)? 表格有什么用途?表具有哪些CSS所没有的功能? 问题答案: 一点都不。但是将表格用于表格数据。只是不要将它们用于一般布局。 但是,如果您显示表格数据(例如结果或什至是表格),请继续使用表格!

  • 在静态编程语言接口中,属性是否使用空get/set语句声明有关系? 例如。。。 我很难注意到不同之处。 在实现接口时,我是否为属性使用getter/setters,或者我是否直接设置值似乎并不重要。 当通过java访问它们时,都有getters,都有getter和setters。

  • 今天我看到这个帖子,看看Chrome控制台是否打开了。 我可以绕过它,它可以被分配给另一个函数。我尝试了,然后检测函数就消失了(我知道写一个模拟函数更好,这里只是一个示例) 使用() 不会破坏检测,怎么走? 最后,我不得不说,我不喜欢被人监督。希望有一个合适的方式四处走动。

  • 问题内容: 在Windows中,有一个文件(其中一个) 包含Java平台的Java源文件。 OSX中的Java 1.6是否有类似的东西?我想在IDE中指定它,以便可以导航到该源。 问题答案: 在我的系统上,src.jar位于/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home中

  • 问题内容: Java中是否有Mutex对象或一种创建对象的方法?我问是因为用1许可初始化的Semaphore对象对我没有帮助。考虑这种情况: 如果在第一次获取时发生异常,则catch块中的释放将增加许可,并且该信号量不再是二进制信号量。 正确的方法是吗? 上面的代码是否可以确保信号量是二进制的? 问题答案: 看到此页面:http : //www.oracle.com/technetwork/art

  • 如果我遇到静态编程语言类而不是泛型Java类,我想执行特殊功能。如何检测它是否是静态编程语言类? 我希望调用会引发异常或失败,如果类不是科特林。但它很好地包装了Java类。然后我注意到,如果我做,它似乎对所有java类的,即使它们有一个默认的构造函数,这是一个好的标记吗?但是,对于科特林类,这是否也返回值? 说“这是静态编程语言课吗?