Конветирую класс java в kotlin

316
08 февраля 2017, 23:53

Конвертирую класс из java в kotlin, при условии, что класс рабочий

public class CurrentActivityUtil {
Activity currentActivity;
public Activity getActivityInstance() {
    getInstrumentation().runOnMainSync(new Runnable() {
        public void run() {
            Collection<Activity> resumedActivity = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
            for (Activity act : resumedActivity) {
                currentActivity = act;
                break;
            }
        }
    });
    return currentActivity;
}
}

Конвертирую hotkey'ем ctrl+alt+shift+K студия предлагает мне следующий вариант кода:

class CurrentActivityUtil {
internal var currentActivity: Activity
val activityInstance: Activity
    get() {
        getInstrumentation().runOnMainSync {
            val resumedActivity = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED)
            for (act in resumedActivity) {
                currentActivity = act
                break
            }
        }
        return currentActivity
    }
}

И сразу же подчеркивает internal var currentActivity: Activity - property must be initialized or be abstract , пробую сделать его просто val currentActivity: Activity но сразу же подчеркивается строка val currentActivity: Activity - val cannot be reassigned.

Answer 1

В Kotlin переменная не может принимать значение NULL, если вы прямо этого не указали.

Вариантов у вас три:

  1. Все таки задать переменной значение при ее декларации.
  2. Использовать lateinit - это, как бы, обещание, что вы ее инициализируете раньше, чем попытаетесь первый раз использовать. Любые NPE будут на вашей совести.
  3. Определить ее как NULLABLE, таким образом: internal var currentActivity: Activity?. Знак вопроса после имени класса.

Ну и еще один момент. Декларация val означает, что переменная иммутабельна, т.е. константа и ее можно только читать. Для определения "обычной" переменной используйте var

Answer 2

Присоеденюсь к ответу данному раннее просто дав готовое решения для вашего класса, как это бы сделал я:

class CurrentActivityUtil {
internal var currentActivity: Activity? = null
val activityInstance: Activity?
    get() {
        getInstrumentation().runOnMainSync {
            val resumedActivity = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED)
            for (act in resumedActivity) {
                currentActivity = act
                break
            }
        }
        return currentActivity
    }
}
READ ALSO
Алгоритм заливки замкнутого контура (FloodFill). Android. Java

Алгоритм заливки замкнутого контура (FloodFill). Android. Java

ЗдравствуйтеХочу реализовать заливку на Java под Android

572
Запись SMS/inbox Android &gt;= 4.4

Запись SMS/inbox Android >= 4.4

Имеется код:

290
Проблема с кнопками в Table LibGDX

Проблема с кнопками в Table LibGDX

В общем, проблема заключается в следующем: при добавлении кнопок на Table возникает сдвиг их области нажатияНа рисунке 1

426
работа с MySql Java

работа с MySql Java

есть вот такой код, мне надо сделать общий запрос sql в базу данных, чтобы он работал в моих разных методах

357