小编Jez*_*zor的帖子

Lombok中的Val在IntelliJ中产生“不兼容类型”错误,但仍然可以正常编译

我找到了这段代码:

Class<? extends Enum> enumClass = Class.forName(Charsets.class.getName())
                                       .asSubclass(Enum.class);
Run Code Online (Sandbox Code Playgroud)

我想使用龙目岛(Lombok)对其进行重构,但是发生了意外情况。当我将其更改为:

val enumClass = Class.forName(Charsets.class.getName())
                     .asSubclass(Enum.class);
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

在此处输入图片说明

令人惊讶的是,代码可以很好地编译,并且使用它的测试可以通过。

我不确定这是Lombok插件,IDE中的错误还是我做错了什么。Lombok是否应该能够轻松推断出变量的正确类型?

我的问题是:我可以安全地使用该代码,还是应该还原为原始代码?

我正在使用最新的(当前)InteliiJ:

IntelliJ IDEA 2016.3

Build#IU-163.7743.44,建于2016年11月17日

JRE:1.8.0_112-release-408-b2 amd64

JVM:JetBrains sro的OpenJDK 64位服务器VM

和龙目岛插件:

龙目岛插件

版本:0.13.16

java intellij-idea lombok

6
推荐指数
2
解决办法
2338
查看次数

是否可以将 @JvmOverloads 添加到 Kotlin 中生成的 copy(...) 方法中?

假设我有以下 Kotlin 类:

data class Person(val firstName: String, val lastName: String)
Run Code Online (Sandbox Code Playgroud)

因为这是一个data类,所以会自动生成具有以下签名的方法:

fun copy(firstName: String = this.firstName, lastName: String = this.lastName): Person
Run Code Online (Sandbox Code Playgroud)

现在,我想从 Java 代码中调用此方法,例如:

Person john = new Person("John", "Smith");
Person adam = john.copy("Adam");
Run Code Online (Sandbox Code Playgroud)

我现在期望有两个Person对象:“约翰·史密斯”和“亚当·史密斯”。

遗憾的是,该copy方法没有重载变体,并且我看不到任何通过@JvmOverloads.

到目前为止,我已经尝试重载它并创建一个扩展,但它被隐藏了,并且像 Java 中的静态方法一样工作(加上有很多样板文件):

@JvmOverloads
fun Person.copy(firstName: String = this.firstName, lastName: String = this.lastName): Person {
    return this.copy(firstName = firstName, lastName = lastName)
}
Run Code Online (Sandbox Code Playgroud)

是否可以以不需要编写太多代码的方式来完成?

java copy immutability kotlin

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

标签 统计

java ×2

copy ×1

immutability ×1

intellij-idea ×1

kotlin ×1

lombok ×1