当前位置: 首页 > 知识库问答 >
问题:

静态编程语言:从Java类访问公共字段,该类也覆盖同名的公共getter

鲁浩言
2023-03-14

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

public class TheirException extends Throwable {
  public String message;

  public TheirException(String message) {
    this.message = message;
  }

  public String getMessage() {
    return this.message;
  }
}

但是,如果我尝试从静态编程语言获取消息,则getMessage()不可用,并会产生未解决的引用错误。尝试使用消息字段会产生以下错误:

错误:(470,30)静态编程语言:重载解决歧义:
公共最终var消息:字符串!定义在com.example.TheirExctive
公共打开val消息:字符串?定义在com.example.TheirExctive

然而,如果我这样做:

(exception as Throwable).message

很好。

为什么这里有必要强制转换为可丢弃的,为什么不能使用getMessage(),是什么导致了这种歧义?

共有1个答案

申屠新觉
2023-03-14

这种歧义是由于消息是公开的。即使没有支持字段,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会创建两个getter,并且在调用站点上,您知道该使用哪个。在您的示例中,两个getter具有相同的行为,但情况并非总是如此。

当您将类强制转换为一个Throwable时,您显式地告诉编译器该类具有Throwable的签名,这意味着您定义了只有一个消息getter,这就解决了歧义。请注意,Kotlin对可丢弃的有自己的定义(这一点稍后会很重要)。

现在你可能会问为什么没有getMessage()函数。这是因为您正在向Throwable而不是java施压。lang.ThrowableThrowable的Kotlin定义没有getMessage()

 类似资料:
  • 我正在尝试从Java切换到Kotlin。但我有很多遗留代码和第三方库。我看到,Java类中经常存在没有getter和setter的公共字段,这些字段必须从其他类访问。如果没有Kotlin代码中的getter,我如何访问Java类的公共字段?

  • 我有一个关于静态方法访问的问题。我有一个类,其中有4个静态方法。如代码所示: } 我正在从下面的代码调用来自onLoadShipperDetailsListCtrl()的setSortingEnable()方法: } 因此,如果我从其他类调用setSortingEnabled()方法,我会认为它是公共的,而其他方法是私有的,但它会给我一个错误:Java . lang . nosuchmethode

  • 到目前为止,我一直在使用这个静态编程语言密封类: 这在我的Kotlin和Java代码中都非常有效。今天我尝试将这个类改为使用对象(建议减少额外的类实例化): 我可以在我的其他静态编程语言文件中引用这个简单的版本,但是我现在正在努力在我的Java文件中使用它。 当我尝试在Java中引用时,我尝试了以下两种回弹编译错误: 有人知道我现在如何在Java中引用该实例吗?

  • 如何调用从公共静态空白到非静态的公共空白碎片类?或者有另一种方法在(listViewHolder.dot.setOnClickListener(new View.OnClickListener()和公共无效搜索3())

  • 问题内容: 和之间有什么区别? 例如 : 要么 问题答案: 尽管您 确实 希望遵守约定,但在功能上没有什么区别(字节码将 完全相同 ),请访问JLS-8.3.1。场修饰符: __ 这将是奇怪的,看.. 我也建议您访问checkstyle。 编辑: 从同一页面链接到该部分: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls

  • 我是Kotlin开发的新手,我不知道如何处理这个问题。我将以下Kotlin数据类映射到MongoDB集合(Spring data MongoDB): 我想覆盖默认的 id 获取器并返回一个字符串而不是对象 Id。似乎“id”字段名称无法更改,因为我收到消息“不允许自定义id属性的字段名称!自定义名称不会被考虑!“,因此我无法使用始终建议的_id解决方案。 如何才能做到这一点?我错过了什么吗?