Spring Kotlin — изменил объект на класс и получил ошибку

#spring #kotlin

Вопрос:

Я изменил свой код с этого:

 object SomeHelper{}
 

к этому:

 @Component 
class SomeHelper(private val anAttribute: AnAttributeService){}
 

AnAttributeService выглядит так:

 @Service
class AnAttributeService(private val myLoader: MyLoader){}
 

Это MyLoader :

 interface MyLoader {
  fun loadSomething()
}
 

В моем тестовом классе я написал что-то вроде этого:

 class SomeHelperTester{
val cut = SomeHelper
//...
}
 

раньше это работало нормально, когда SomeHelper был объектом, но теперь, когда я пишу

 val cut = SomeHelper(anAttribute = AnAttributeService(myLoader = MyLoader))
 

MyLoader подчеркнут красным цветом с сообщением об ошибке Classifier MyLoader does not have a companion object, and thus must be initialized

Как я могу заставить эту строку кода работать?

Ответ №1:

после myLoader = вам нужно предоставить экземпляр type MyLoader . вы не можете просто сказать MyLoader там.

Если MyLoader бы это был класс, на который вы могли бы просто его изменить MyLoader() . Но вы определили MyLoader его как интерфейс, что означает, что вам нужно предоставить для него реализацию.

Наиболее распространенный способ сделать это — создать класс, который расширяет интерфейс, и создать его экземпляр. например:

 class MyLoaderImp: MyLoader {
    override fun loadSomething() {
        //implementation here
    }
}
 

затем вы можете сделать

 val cut = SomeHelper(anAttribute = AnAttributeService(myLoader = MyLoaderImp()))
 

также обратите внимание, что в kotlin вам не нужно явно указывать имена параметров, если вы не указываете их в другом порядке или не пропускаете некоторые, так что это также допустимо и короче

 val cut = SomeHelper(AnAttributeService(MyLoaderImp()))
 

в качестве альтернативы вы можете предоставить реализацию в анонимном классе следующим образом

 val cut = SomeHelper(AnAttributeService(object: MyLoader{
    override fun loadSomething() {
        //implementation here
    }
}))
 

Мне кажется, что вам все еще не хватает многих основ о kotlin и программировании в целом. Я предлагаю вам изучить некоторые разделы документации на веб-сайте kotlin, чтобы лучше понять все:

https://kotlinlang.org/docs/home.html