Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin:从一个Java类访问一个公共字段,该类还重写了一个同名的公共getter_Java_Kotlin - Fatal编程技术网

Kotlin:从一个Java类访问一个公共字段,该类还重写了一个同名的公共getter

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; } }

我有一个Java类(我无法编辑,因为它是由Thrift自动生成的)定义如下:

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的公共字段?让这个领域成为私人领域@Deepak
getFoo()
不可用“未解析引用”@Lino version 1.3.20@Seelenvirtuose问题是关于如何使用从Kotlin生成的类,而不是关于如何更改原始类。在Kotlin 1.3中,我能够使用
.foo
以及
.getFoo()
编译和执行代码,感谢您的回答。虽然这解释了这种模糊性,但是否存在访问原始方法的kotlin方法?我能想到的一件事是创建一个明确的显式java访问器创建一个显式java访问器可以解决这个问题,另一个解决方案是使用反射显式调用该方法。如果我创建一个类并添加一个公共字段和一个getter,它们都可以从Kotlin访问。只是添加了继承导致了这个问题,所以我认为你的解释是不正确的。