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

如何在init块中处理重写的属性?

谭学名
2023-03-14
open class Base(open val input: String) {
  lateinit var derived: String

  init {
    derived = input.toUpperCase() // throws!
  }
}

class Sub(override val input: String) : Base(input)
println(Sub("test").derived)    

更新:我发布了两个更简洁的代码片段,说明了混乱的根源:

https://gist.github.com/mttkay/9fbb0ddf72f471465afc https://gist.github.com/mttkay/5dc9bde1006b70e1e8ba

共有1个答案

唐照
2023-03-14

原始示例相当于下面的Java程序:

class Base {
    private String input;
    private String derived;

    Base(String input) {
        this.input = input;
        this.derived = getInput().toUpperCase();  // Initializes derived by calling an overridden method
    }

    public String getInput() {
        return input;
    }
}

class Derived extends Base {
    private String input;

    public Derived(String input) {
        super(input);    // Calls the superclass constructor, which tries to initialize derived
        this.input = input;  // Initializes the subclass field
    }

    @Override
    public String getInput() {
        return input;   // Returns the value of the subclass field
    }
}

子类中重写了getInput()方法,因此代码调用Sub.getInput()。此时子类的构造函数尚未执行,因此保存Sub.input值的支持字段仍然为null。这不是科特林的bug;在纯Java代码中很容易遇到同样的问题。

修复方法是不重写该属性。(我已经看到了您的评论,但这并不能真正解释为什么您认为需要重写它。)

 类似资料:
  • 问题内容: 我想在Swift中编写一个方法。在这里,我在Objective-C中初始化一个类: 如何在Swift中编写此方法? 问题答案: 我想这可能是您上课的良好基础 我想避免将键复制粘贴到项目中,因此我将可能的键放入这样的示例中: 并且您可以像这样改进您的方法,并且将来您可以避免代码中任何可能的键错误: 注意:那只是如何做的一个原始想法,根本不需要使用便捷的初始化程序,但是对于我对您的最终课程

  • 问题内容: 如果一个月的大写或小写(即不是标题),则DateTimeFormatter无法解析日期。有没有简单的方法可以将日期转换为标题大小写,还是可以使格式化程序更宽松? 版画 问题答案: s是严格的,默认情况下区分大小写。使用和指定以区分大小写。 为了能够解析数字月份(即),您还需要指定。 您也可以更冗长地指定仅月份部分为不区分大小写/宽大: 从理论上讲,这可能会更快,但我不确定是否可以。 P

  • 问题内容: 因此,我尝试尝试计算以下字符串的数百万种不同组合,但我每秒仅计算大约1,750种组合,这甚至还远没有达到我所需的速度。那么,我将如何重塑这种形状,以便同一件事情的多个过程正在计算不同的零件,而不是在计算已经计算出的零件并保持快速的速度呢?下面的代码部分是我一直在使用的代码。任何例子将不胜感激! 问题答案: 将产品分解成一个部分的一种方法是分解产品的第一个组成部分,以便每个独立的作业都具

  • 我如何添加/覆盖max.poll.interval.ms和max.poll.records在我的. yml文件在Spring启动Kafka微服务项目 我试过了,但没用

  • 我正在使用portlet,并在Liferay的wiki上处理示例:https://www.liferay.com/documentation/liferay-portal/6.1/development/-/ai/writing-the-my-greeting-portl-4 我在处理表单后将portlet重定向回init jsp时遇到了一些问题。我的Java类是: 在edit.jsp的表单sub

  • 我面临Elasticsearch结果的问题,该结果在属性名称中使用@。json结果片段: {“\u index”:“logs-2015.12.31”,“\u type”:“log”,“\u id”:“AVH4eA4QKV0mbJuiIHO1”,“\u score”:null,“\u source”:{“@timestamp”:“2015-12-31T14:36:35.378Z”,“beat”:{“