Я хочу проверить, что дочерний класс SignalPayload
реализует интерфейс IConvertible
. Как я могу это сделать?
sealed class SignalPayload { companion object { fun trueTypeInstance(type: KClass<SignalPayload>) : SignalPayload? { // if (*** __ KClass<SignalPayload> implemented IConvertible ___ **) ...... } } } object Empty : SignalPayload() data class BadData(val message: String = "BAD") : SignalPayload() { override fun toString(): String { return message } } data class payloadString(private var payload: String = "") : SignalPayload(), IConvertible data class payloadInt(private var payload: Int = 0) : SignalPayload(), IConvertible data class payloadFloat(private var payload: Float = 0F) : SignalPayload(), IConvertible data class payloadBool(private var payload: Boolean = false) : SignalPayload(), IConvertible interface IConvertible { val asBool: Boolean val asInt: Int val asFloat: Float val asString: String fun setFromPayload(data: IConvertible) }
Как я могу это сделать?
UPD
То, что я подумал, использует его.
Класс SignalChannel
знает, какое поле требуется для mPayload
(через свойство val type: ???
). Сначала mPayload
равен Empty
interface IArriving { fun onNewPayload(data: SignalPayload, sender: IArriving?) } interface IConvertible { val asBool: Boolean val asInt: Int val asFloat: Float val asString: String fun setFromPayload(data: IConvertible) } class SignalChannel(val idx: Int, val type: ???, val name: String = "") : IArriving { var mPayload: SignalPayload = Empty // when new data arriving - need converting for `type` and refresh field mPayload override fun onNewPayload(data: SignalPayload, sender: IArriving?) { if ( mPayload is Empty ) { mPayload = SignalPayload.trueTypeInstance(type) // that's my problem } mPayload.setFromPayload(data) } }
Вы можете использовать правильные дженерики, чтобы ограничить метод типами, которые являются как SignalPayload
и IConverible
:
fun <T> trueTypeInstance(): SignalPayload? where T : IConvertible, T : SignalPayload { TODO() }
Вызывается следующим образом:
SignalPayload.trueTypeInstance<payloadString>() //OK SignalPayload.trueTypeInstance<Empty>() //Fails SignalPayload.trueTypeInstance<String>() //Fails
Не уверен в вашем случае использования, хотя …