Kotlin:从Java类访问一个公共字段,该类也将覆盖同名的公共getter

时间:2019-03-14 09:15:53

标签: java kotlin

我有一个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 不可用,是什么引起歧义?

1 个答案:

答案 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.ThrowableThrowable的Kotlin定义没有getMessage()