Kotlin:从一个Java类访问一个公共字段,该类还重写了一个同名的公共getter
我有一个Java类(我无法编辑,因为它是由Thrift自动生成的)定义如下:Kotlin:从一个Java类访问一个公共字段,该类还重写了一个同名的公共getter,java,kotlin,Java,Kotlin,我有一个Java类(我无法编辑,因为它是由Thrift自动生成的)定义如下: public class TheirException extends Throwable { public String message; public TheirException(String message) { this.message = message; } public String getMessage() { return this.message; } }
public class TheirException extends Throwable {
public String message;
public TheirException(String message) {
this.message = message;
}
public String getMessage() {
return this.message;
}
}
但是,如果我试图从Kotlin获取消息
,getMessage()
不可用,并产生未解析的引用
错误。尝试使用消息
字段会产生以下错误:
错误:(470,30)Kotlin:重载解析歧义:公共最终var消息:字符串!在com.example.TheirException中定义
公共打开val消息:字符串?在com.example.TheirException中定义 但是,如果我这样做:
(exception as Throwable).message
这很好解决
为什么这里有必要强制转换为可丢弃的,
getMessage()
为什么不可用,以及是什么导致了歧义?歧义是由于消息
是公开的。即使没有支持字段,Kotlin也会将每个getter转换为属性。如果将另一个函数添加到此类:
public String getSecondMessage() {
return "second message"; // Note that this getter does not rely on a field
}
您可以在Kotlin中这样访问它:
TheirException("message").secondMessage
如果message
是公共的,并且有一个getMessage()
函数,则Kotlin会创建2个getter,并且在调用站点上,您知道要使用哪个getter。在您的示例中,两个getter具有相同的行为,但情况并非总是如此
当您将类强制转换为Throwable
时,您明确地告诉编译器该类具有Throwable
的签名,这意味着您定义应该只有一个消息
getter,这就解决了歧义。请注意,Kotlin对可丢弃的有自己的定义(这一点稍后会很重要)
现在您可能会问为什么没有getMessage()
函数。这是因为您正在强制转换为Throwable
,而不是java.lang.Throwable
。Throwable
的Kotlin定义没有getMessage()
您能试试getFoo()吗?kotlin也允许使用相同的方法名进行访问。您使用的是什么kotlin verison?在1.3中,javaClass.foo
指向字段,javaClass.getFoo()
指向方法为什么有一个带有公共getter的公共字段?让这个领域成为私人领域@DeepakgetFoo()
不可用“未解析引用”@Lino version 1.3.20@Seelenvirtuose问题是关于如何使用从Kotlin生成的类,而不是关于如何更改原始类。在Kotlin 1.3中,我能够使用.foo
以及.getFoo()
编译和执行代码,感谢您的回答。虽然这解释了这种模糊性,但是否存在访问原始方法的kotlin方法?我能想到的一件事是创建一个明确的显式java访问器创建一个显式java访问器可以解决这个问题,另一个解决方案是使用反射显式调用该方法。如果我创建一个类并添加一个公共字段和一个getter,它们都可以从Kotlin访问。只是添加了继承导致了这个问题,所以我认为你的解释是不正确的。