【问题标题】:How can I add multiple and empty constructor in kotlin?如何在 kotlin 中添加多个空构造函数?
【发布时间】:2021-04-09 21:03:23
【问题描述】:

我有这个 Java 类,想把它转换成 Kotlin,我怎么能有特别是空的构造函数?

class Element {
int id;
Element element1;
Element element2;

public Element() {
}

public Element(int value) {
    this.id = value;
}

public Element(int value, Element element1, Element element2) {
    this.id = value;
    this.element1 = element1;
    this.element2 = element2;
}}

我试过这样:

class Element {
var id = 0
var element1: Element? = null
var element2: Element? = null

constructor() {}
constructor(value: Int) {
    id = value
}

constructor(value: Int, element1: Element?, element2: Element?) {
    id = value
    this.element1 = element1
    this.element2 = element2
}}

但是当我尝试访问 element.element1 并将其传递给需要 Element 的函数时,它会说:

类型不匹配。 必需:元素 找到:元素?

我改变了函数

fun checkIfElementEqualsSearch(search: Int, rootElement: Element){...}

fun checkIfElementEqualsSearch(search: Int, rootElement: Element?{...}

现在就像一个魅力!

感谢您的帮助

【问题讨论】:

标签: kotlin constructor


【解决方案1】:

当我尝试访问 element.element1 并将其传递给需要 Element 的函数时,它会说:

类型不匹配。必需:元素找到:元素?

我怎样才能避免这种情况?

这是因为Element 类中的element1 类型(实际上是node1)可以为空(Element? 带有问号)。 如果一个函数被声明为接受Element(不带问号),则意味着它不接受null。 Kotlin 在编译时强制执行这种 null 安全性,这就是它很棒的原因。

根据您要寻找的行为,您有多种选择:

  • 让函数接受Element? 而不是Element,如果它在自己的主体中处理空值
  • 使用elvis operator ?: 提供后备值或抛出异常以防您的元素实际上为空:
    myFunction(element.node1 ?: someNonNullElement)
    
    myFunction(element.node1 ?: error("Something went wrong"))
    
  • 检查 null 并依靠智能转换来保证元素不为 null:
    val elt = element.node1
    if (elt != null) {
        myFunction(elt)
    }
    

【讨论】:

    猜你喜欢
    • 2021-10-26
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    相关资源
    最近更新 更多