Как получить доступ к статической переменной Java Interface после преобразования в Kotlin - PullRequest
0 голосов
/ 24 октября 2018

У меня есть интерфейс в Java со статической переменной interfaceValue, к которому я могу получить доступ, как показано ниже

public class Experimenting {

    public interface MyInteface {
        int interfaceValue = 10;
    }

    class MyImpl implements MyInteface { }

    MyImpl myImpl = new MyImpl();

    void testing() {
        int getInterfaceValue = myImpl.interfaceValue;
    }
}

Когда я конвертирую в Kotlin, он выглядит так, как показано ниже

class Experimenting {

    internal var myImpl = MyImpl()

    interface MyInteface {
        companion object {
            val interfaceValue = 10
        }
    }

    internal inner class MyImpl : MyInteface

    internal fun testing() {
        val getInterfaceValue = myImpl.interfaceValue
    }
}

Однако myImpl.interfaceValue показывает знак ошибки компиляции, где он не распознает interfaceValue.Как я могу получить доступ к своему interfaceValue в Котлине?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Полагаю, правильное преобразование такого Java-кода в код Kotlin должно быть таким, как показано ниже

class Experimenting {

    internal var myImpl = MyImpl()

    interface MyInteface {

        val interfaceValue: Int
        get() = 10
    }

    internal inner class MyImpl : MyInteface

    internal fun testing() {
        val getInterfaceValue = myImpl.interfaceValue
    }
}

Хотя синтаксически они отличаются, то есть interfaceValue на самом деле не статическая переменная, но практичность та же.

0 голосов
/ 24 октября 2018

Преобразование преобразует статический финал interfaceValue в val в companion эквиваленте Котлина.К сожалению, конвертер не идеален и иногда все портит.Чтобы получить к нему доступ

import com.your.package.Experimenting.MyInteface.Companion.interfaceValue    
class Experimenting {

    internal var myImpl = MyImpl()

    interface MyInteface {
        companion object {
           const val interfaceValue = 10
        }
    }

    internal inner class MyImpl : MyInteface

    internal fun testing() {
        val getInterfaceValue = interfaceValue
    } 
}

делает свое дело.

также делает:

class Experimenting {

    internal var myImpl = MyImpl()

    interface MyInteface {
        companion object {
           val interfaceValue = 10
        }
    }

    internal inner class MyImpl : MyInteface

    internal fun testing() {
        val getInterfaceValue = MyInteface.interfaceValue
    }
}

Третий способ - скопировать значение interfaceValue в реализациюкласс:

class Experimenting {

    internal var myImpl = MyImpl()

    interface MyInteface {
        companion object {
            const val interfaceValue = 10
        }
    }

    internal inner class MyImpl : MyInteface{
        val interfaceValue = MyInteface.interfaceValue
    }

    internal fun testing() {
        val getInterfaceValue = myImpl.interfaceValue
    }
}

По сути, вы обращаетесь к нему так же, как к статической переменной в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...