标签: java-interop

更改kotlin扩展函数接收器JVM名称

这是一个普遍的问题.假设我有一个用kotlin编写的扩展函数,它将DP转换为PX并返回一个NonNull Int

fun Int.toPx() {  /** implementation */ }
Run Code Online (Sandbox Code Playgroud)

java中的函数看起来像这样

public int toPx(int $receiver) {  /** implementation */ }
Run Code Online (Sandbox Code Playgroud)

在我看来,这$receiver使得Java-interop感觉生成和不受欢迎.

我知道你可以使用@JvmName注释和一些组合@file:JvmName来改变java中的名字.

当我尝试使用@JvmNamereceiver网站的目标,它说

"此注释不适用于目标type usage和使用站点目标@receiver"

有没有办法克服这一点并改变接收器的名称,如果不是最好的选择.

java java-interop kotlin kotlin-interop

6
推荐指数
1
解决办法
652
查看次数

将Java集合转换为Clojure数据结构

我正在使用返回java.util.LinkedHashSet的方法创建Java API的Clojure接口.

首先,处理此问题的惯用Clojure方法是将LinkedHashSet转换为clojure数据结构吗?

其次,将Java集合转换为Clojure数据结构的最佳方法是什么?

java collections idioms clojure java-interop

5
推荐指数
1
解决办法
1609
查看次数

在 Kotlin 中扩展 Java 类时继承的平台声明发生冲突

我正在尝试使用 Kotlin 扩展第三方 Java 类,但收到以下编译器消息:

继承的平台声明冲突:以下声明具有相同的 JVM 签名 (setCollection(Ljava/util/Collection;)V):

  • fun setCollection(collection:(Mutable)Collection<(raw)Any?>!: 在 KotlinClass 中定义的单位

  • fun setCollection(collection:(Mutable)Collection<String!>!):KotlinClass 中定义的单位

无论我做什么,都无法仅使用 Kotlin 代码对其进行编译。

重现情况的代码:

//JavaInterface.class
import java.util.Collection;

public interface JavaInterface {
    void setCollection(Collection<String> collection);
}

//JavaBaseClass.class
import java.util.Collection;

public class JavaBaseClass {
    public void setCollection(Collection collection){}
}

//JavaSubClass.class
public class JavaSubClass extends JavaBaseClass implements JavaInterface {}

//KotlinClass.kt
class KotlinClass : JavaSubClass() 
Run Code Online (Sandbox Code Playgroud)

Java本身不存在这个问题。所以我的猜测是这可能与平台类型有关(String!不是Any?)。

是否有一个优雅的解决方法来解决这个问题,并且最好不涉及编写Java代码?或者应该在 Kotlin 编译器本身中修复这个问题?

inheritance java-interop kotlin

5
推荐指数
1
解决办法
2053
查看次数

Clojure - 将列表转换为Java数组

是否有任何惯用的方法将Clojure列表转换为Java数组,除了首先将其转换为vector并使用into-array(意味着,除了之外(into-array (vec my-list)),我不想要额外的开销)?

list clojure java-interop data-structures

4
推荐指数
1
解决办法
2317
查看次数

为什么HashMap.get不返回可空类型?

我有点惊讶,以下示例抛出NullPointerException:

fun main(args: Array<String>) {
    val hm = HashMap<String, Int>()
    hm.put("alice", 42)
    val x = hm.get("bob")
    println(x)   // BOOM
}
Run Code Online (Sandbox Code Playgroud)

我以为NullPointerExceptionKotlin代码中没有s?

如果我使用x可选类型进行注释,则编程将打印null:

fun main(args: Array<String>) {
    val hm = HashMap<String, Int>()
    hm.put("alice", 42)
    val x: Int? = hm.get("bob")
    println(x)   // null
}
Run Code Online (Sandbox Code Playgroud)

我是否发现了一个特例,或者这是Kotlin/Java互操作的一般问题?

我正在使用带有Kotlin 0.11.91.1插件的IntelliJ IDEA 14.1社区版.

null nullpointerexception java-interop kotlin java-collections-api

3
推荐指数
1
解决办法
955
查看次数

当您在Clojure中扩展Java类并定义与该类中的方法同名的方法时,会发生什么?

我一直在阅读Programming Clojure,我在理解Stuarts主Java Interop示例时遇到了一些麻烦.他扩展了DefaultHandler,并创建了一个startElement方法,然后将该处理程序传递给XML解析器.我不明白的是,到底发生了什么.他的startElement实现是否覆盖了DefaultHandler中定义的实现?我糊涂了.我没有使用Java的经验,也没有面向对象的经验.

谢谢!

clojure java-interop

2
推荐指数
1
解决办法
2467
查看次数

.NET 中的 MPXJ 将 java Date 转换为 .NET DateTime

我正在使用 .NET 中的 MPXJ 库来解析 MS Project (MPP) 文件,而且效果很好。我遇到的一个问题是尝试将任务开始和完成日期转换为 .NET DateTime 以与我的数据模型一起使用。

我正在完成所有任务并调用 task.getFinish() 和 task.getStart() ,它们都返回 javva.util.Date 对象。

当我使用 task.getFinish().getYear()、task.getFinish().getMonth() 等来构建新的 DateTime 对象时,它会警告我它们已过时。

将开始和结束日期从 MPXJ 获取到 .NET DateTime 对象的最佳方法是什么?

谢谢。

.net java-interop mpxj

2
推荐指数
1
解决办法
2552
查看次数