Intereting Posts
Как зарегистрировать InstanceCreator с Gson в Котлине? Сложить список для сопряжения с назначением деструктуризации в котлин Dagger2 @Nullable аннотация с Kotlin Я хочу, чтобы каждый элемент массива каждого массива отображался в виде единого кадра `break` и` continue` в `forEach` в Котлине Как я могу перерисовать Anko frameLayout при изменении моей модели? Почему Котлин не разрешает использовать какой-либо код в основном конструкторе? Избегайте конфликта с Kotlin runtime / stdlib с другими плагинами Синтетический и пользовательский макет Kotlin в DialogFragment Соответствующие имена параметра в реализованных / переопределенных методах Как выполнить многоступенчатую инициализацию val Фрагмент Котлина Получение NoClassDefFoundError при вызове функции расширения kotlin Почему var с частным сеттером является инвариантной позицией? Как издеваться над классом Kotlin (final) с помощью PowerMock?

Ссылка на значения и методы вызова в типах общих типов

Я новичок в Kotlin из C #. В настоящее время я пытаюсь настроить класс, который принимает несколько взаимозаменяемых типов, внутренний код этого класса является конечной точкой службы.

Я начал с чего-то вроде ниже, однако у меня, похоже, возникают проблемы с синтаксисом, чтобы ссылаться на параметры тела запроса, а также на вызов метода, который относится к типам, переданным через конструктор класса. Синтаксис дженериков и рефлексии не кажется, что прямое и большинство примеров Котлина, которые я копаю, по-видимому, не охватывают именно то, что я пытаюсь сделать (если возможно). Экземпляр объекта type1 будет передан через параметр body, а экземпляр объекта type2 должен быть передан через конструктор (синтаксис, вероятно, неверен).

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

Любая помощь приветствуется.

import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestMethod import javax.validation.Valid open class Base <T1,T2>(t1: Class<T1>, t2: Class<T2>) { @Autowired var type1 = t1 @Autowired var type2 = t2 @ApiOperation(value = "API 1", response = myResponse::class) @ApiResponses(value = *arrayOf( ApiResponse(code = 200, message = "successful", response = CcdaResponse::class), ApiResponse(code = 405, message = "Invalid", response = Void::class))) @RequestMapping( value = "/myEndPoint", produces = arrayOf("application/json"), consumes = arrayOf("application/json"), method = arrayOf(RequestMethod.POST) ) fun endpoint( @ApiParam(value = "Options", required = true) @Valid @RequestBody body: Class<T1> ): ResponseEntity<myResponse> { val r = myResponse() val response: ResponseEntity<myResponse> response = ResponseEntity(r, HttpStatus.OK) try { //payload val parameters = Parameters().apply { Id1 = type1::body.Id1.get() Id2 = type1::body.Id2.get() Id3 = type1::body.Id3.get() Id4 = type1::body.Id4.get() v = type1::body.v.get() } //Do stuff like calling method in class of type2 passed in val d = type2.getViewModel(parameters) r.status = "ok" } catch (e: Exception) { r.message = e.toString() r.status = "error" } finally { } return response } } 

Типы параметров передаются через аргументы типа при создании экземпляра (аналогично Java). Таким образом, вам нужно передать сами типы, добавив параметр Class это не правильный синтаксис.

Я считаю, что это то, что вы ищете (для краткости опущен некоторый код).

 open class Base<T1, T2> (@Autowired var t2: T2) { @Autowired var type1: T1? = null fun endpoint( @ApiParam(value = "Options", required = true) @Valid @RequestBody body: T1 ): ResponseEntity<MyResponse> { type1 = body } } 

Затем, например, вы можете создать экземпляр этого класса с типами Int и String (для T1 и T2 соответственно) следующим образом.

 val t2 = "t2" val base = Base<Int, String>(t2) 

Или вы можете подклассифицировать Base класс любым (или ничем) из указанных типов.

 class SubBase(t2: String): Base<Int, String>(t2)