Общий как параметр для конструктора - PullRequest
0 голосов
/ 20 мая 2019

Я смотрю на код, который имеет несколько записей, таких как:

open class PersonFinder: Finder<Long, Person>(Person::class.java)
open class CompanyFinder: Finder<Long, Company>(Company::class.java)
open class DeviceFinder: Finder<Long, Device>(Device::class.java)

Я бы хотел более общий подход, примерно такой:

open class GenericFinder<T>: Finder<Long, T>(T::class.java)

но синтаксис недопустим, поскольку T :: class.java не может использоваться в качестве параметра здесь. Можно ли как-то идиоматически сделать эту работу?

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Если вы (по крайней мере, достаточно часто) хотите использовать GenericFinder напрямую вместо его подкласса, вы можете добавить вспомогательную функцию с параметром типа reified :

open class GenericFinder<T>(type: Class<T>) : Finder<Long, T>(type) { ... }

inline fun <reified T> GenericFinder() = GenericFinder(T::class.java)
0 голосов
/ 20 мая 2019

Я думаю, что нашел решение:

open class GenericFinder<T>(type: Class<T>) : Finder<Long, T>(type)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...