我有一个Java类(我无法编辑,因为它是Thrift自动生成的),定义如下:
class Foo {
myMethod() {
console.log('myMethod')
}
}
var foo = new Foo()
var method = 'myMethod'
foo[method]()
但是,如果我尝试从Kotlin获得foo[method].apply(someScope, [ argA, argB, ... ])
,则public class TheirException extends Throwable {
public String message;
public TheirException(String message) {
this.message = message;
}
public String getMessage() {
return this.message;
}
}
不可用,并产生message
错误。尝试使用getMessage()
字段会产生以下错误:
错误:(470,30)Kotlin:重载分辨率不明确:
中定义
公共最终var消息:字符串!在com.example.TheirException
中定义 公共开放式val消息:字符串?在com.example.TheirException
但是,如果我改为这样做:
Unresolved reference
它解决得很好。
为什么在这里强制转换为message
,为什么(exception as Throwable).message
不可用,是什么引起歧义?
答案 0 :(得分:2)
模棱两可是由于message
是公开的。即使没有背景字段,Kotlin也会将每个吸气剂都转换为属性 。如果您向此类添加其他函数:
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,并且您较新的在呼叫站点上会知道使用哪个。在您的示例中,两个吸气剂将具有相同的行为,但并非总是如此。
将类强制转换为Throwable
时,您明确告诉编译器该类具有Throwable
的签名,这意味着您定义应该只有一个message
getter ,这解决了歧义。请注意,Kotlin有自己的Throwable
定义(稍后将很重要)。
现在您可能会问为什么没有getMessage()
函数。这是因为您要转换为Throwable
,而不是java.lang.Throwable
。 Throwable
的Kotlin定义没有getMessage()