这是一个普遍的问题.假设我有一个用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中的名字.
当我尝试使用@JvmName与receiver网站的目标,它说
"此注释不适用于目标type usage和使用站点目标@receiver"
有没有办法克服这一点并改变接收器的名称,如果不是最好的选择.
我正在使用返回java.util.LinkedHashSet的方法创建Java API的Clojure接口.
首先,处理此问题的惯用Clojure方法是将LinkedHashSet转换为clojure数据结构吗?
其次,将Java集合转换为Clojure数据结构的最佳方法是什么?
我正在尝试使用 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 编译器本身中修复这个问题?
是否有任何惯用的方法将Clojure列表转换为Java数组,除了首先将其转换为vector并使用into-array(意味着,除了之外(into-array (vec my-list)),我不想要额外的开销)?
我有点惊讶,以下示例抛出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
我一直在阅读Programming Clojure,我在理解Stuarts主Java Interop示例时遇到了一些麻烦.他扩展了DefaultHandler,并创建了一个startElement方法,然后将该处理程序传递给XML解析器.我不明白的是,到底发生了什么.他的startElement实现是否覆盖了DefaultHandler中定义的实现?我糊涂了.我没有使用Java的经验,也没有面向对象的经验.
谢谢!
我正在使用 .NET 中的 MPXJ 库来解析 MS Project (MPP) 文件,而且效果很好。我遇到的一个问题是尝试将任务开始和完成日期转换为 .NET DateTime 以与我的数据模型一起使用。
我正在完成所有任务并调用 task.getFinish() 和 task.getStart() ,它们都返回 javva.util.Date 对象。
当我使用 task.getFinish().getYear()、task.getFinish().getMonth() 等来构建新的 DateTime 对象时,它会警告我它们已过时。
将开始和结束日期从 MPXJ 获取到 .NET DateTime 对象的最佳方法是什么?
谢谢。
java-interop ×7
clojure ×3
kotlin ×3
java ×2
.net ×1
collections ×1
idioms ×1
inheritance ×1
list ×1
mpxj ×1
null ×1