Немного расширяю ответ, который дал @Scrobot.
В короткие сроки вы не можете делать то, что пытаетесь сделать. Когда вы указываете List<A>
в качестве типа, вы пропускаете информацию о том, реализует ли элементы в вашем списке интерфейс B.
Если бы вы могли делать то, что пытались сделать, вы могли бы очень легко взломать ваш код, выполнив такие действия:
class PureA : A {
override var name: String
}
val list: List<A> = arrayListOf(
C("user1", "job"),
PureA("user2")
)
// The following line will not work, and for good reason
// E(list)
Если бы сработала последняя строка, вы бы просто сломали свой код. PureA является допустимым элементом в списке As, но не относится к E.
Следующее намного ближе к тому, что вы собираетесь делать:
// Doesn't work fully
class D<T> where T: A, T: B {
private fun getList(): E<T> {
val list: List<T> = arrayListOf<T>(
C("user1", "job1"),
C("user2", "job2"),
C("user3", "job3")
)
E(list)
}
}
Я не мог увидеть полный способ завершить то, что вам делать. Я предполагаю, что вы хотите разрешить будущие классы, которые также реализуют A и B. Единственный способ, который я нашел, будет работать:
interface AB : A, B
class C(
override var name: String,
override var job: String
) : AB
class D {
private fun getList() {
val list: List<AB> = arrayListOf(
C("user1", "job1"),
C("user2", "job2"),
C("user3", "job3")
)
E(list)
// I want to init E() my constructor here
}
}
Это очень хорошее решение, даже если оно дает больше интерфейсов. Но обычно это прекрасно:)