【问题标题】:Kotlin Array creation: No value passed for parameter 'init' [duplicate]Kotlin数组创建:没有为参数'init'传递值[重复]
【发布时间】:2018-07-11 22:32:46
【问题描述】:

我在 Android Studio 中将 Java 文件转换为 Kotlin,但出现此错误:

没有为参数“init”传递值

我通过添加 lateinit

稍微修改了代码

java代码是:

 private TextView[] dots;
 private int[] layouts;

private void addBottomDots(int currentPage)
{
    dots = new TextView[layouts.length]; 
    //some lines here
}

而对应的Kotlin代码是

private lateinit var dots: Array<TextView>
private lateinit var layouts: IntArray

private fun addBottomDots(currentPage: Int)
    {
       dots = Array<TextView>(layouts.size) // error happens here
       // some lines here

    }

因为我是 Kotlin 的新手,所以我不明白为什么会这样

【问题讨论】:

    标签: kotlin android-studio-3.0 kotlin-android-extensions


    【解决方案1】:

    检查 Array 构造函数:public inline constructor(size: Int, init: (Int) -&gt; T) - 这就是发生错误的原因。

    猜你想创建ArrayList

    dots = ArrayList<TextView>(layouts.size)
    

    【讨论】:

    • 另一种可能是dots = Array&lt;TextView&gt;(layouts.size, init= {i:Int -&gt; null}) 希望这会有所帮助
    【解决方案2】:

    代码不等价。您的原始代码实际上代表了 var dots: Array&lt;TextView?&gt; 类型,因为数组的值可能未初始化。

    因为您将其定义为非空值,所以 Array 唯一可用的构造函数需要一个函数来将所有元素初始化为非空值。您可以提供这个或将类型更改为可为空并使用dots = arrayOfNulls(layouts.size)

    【讨论】:

    • 你说得对,我稍微修改了这段代码。但问题出在哪里?
    • 您正在创建一个非空值数组,但未提供非空值。
    • 之所以存在问题,是因为 Kotlin 要求其类型具有严格的可空性。默认情况下,Java 数组使用null 填充,因此它们只能是可为空类型的数组。为了安全地创建不可为空的数组,该库提供了确保立即用非空值填充以满足非空要求的方法。
    • 那我应该在代码中改变什么?我在 oncreate() 方法 @MarkoTopolnik 中实例化了布局变量
    • 创建数组时可以初始化所有元素吗?然后使用不可为空的构造函数一次性初始化它。它们只是逐步可用的吗?那么你别无选择,只能使用可空数组并在访问期间检查以确保空安全。
    猜你喜欢
    • 2020-06-08
    • 1970-01-01
    • 2022-07-22
    • 2020-03-12
    • 2018-02-27
    • 2017-09-04
    • 2016-07-22
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多