Kotlin 将类中使用的接口列表传递给构造函数

Kotlin 将类中使用的接口列表传递给构造函数,kotlin,Kotlin,我有两个接口,有两个不同的变量。 我创建了一个实现这两个接口的类。 现在我想将第一个接口的列表传递给另一个类的构造函数,并使用它的属性(从两个接口)。到目前为止,我成功地获得了构造函数,但我找不到如何传递参数列表 interface A { var name: String } interface B { var job: String } class C( override var name: String, override var job: String

我有两个接口,有两个不同的变量。 我创建了一个实现这两个接口的类。 现在我想将第一个接口的列表传递给另一个类的构造函数,并使用它的属性(从两个接口)。到目前为止,我成功地获得了构造函数,但我找不到如何传递参数列表

interface A {
    var name: String
}

interface B {
    var job: String
}

class C(
    override var name: String,
    override var job: String
) : A, B

class D() {
    private fun getList() {
        val list: List<A> = arrayListOf(
            C("user1", "job1"),
            C("user2", "job2"),
            C("user3", "job3")
        )
        // I want to init E() my constructor here 
    }
}

class E<T>(val list: List<T>) where T : A, T: B {
    fun display() {
        list.forEach {
            println("my name is ${list.get(i).name} and I am a ${list.get(i).job}")
        }
    }
}
接口A{
变量名称:String
}
接口B{
变量作业:字符串
}
C类(
重写变量名:String,
重写变量作业:字符串
):A,B
D类(){
私人娱乐清单(){
val list:list=arrayListOf(
C(“用户1”、“作业1”),
C(“用户2”、“作业2”),
C(“用户3”、“作业3”)
)
//我想在这里初始化我的构造函数
}
}
E类(val列表:列表),其中T:A,T:B{
趣味展示(){
list.forEach{
println(“我的名字是${list.get(i).name},我是${list.get(i.job}”)
}
}
}

如果我正确理解了您的问题,您的代码只需稍加改进即可解决问题

interface A {
    var name: String
}

interface B {
    var job: String
}

class C(
    override var name: String,
    override var job: String
) : A, B

class D {
    fun getList(): E<C> = E(
        arrayListOf(
            C("user1", "job1"),
            C("user2", "job2"),
            C("user3", "job3")
        )
    )
}

class E<T>(val list: List<T>) where T : A, T: B {
    fun display() {
        // for (i in 1..10) will throw OutOfBoundsException
        list.forEach {
            println("my name is ${it.name} and I am a ${it.job}")
        }
    }
}

// to test
fun main(args: Array<String>) {
    D().getList().display()

    /* will prints
       my name is user1 and I am a job1
       my name is user2 and I am a job2
       my name is user3 and I am a job3 */
}
接口A{
变量名称:String
}
接口B{
变量作业:字符串
}
C类(
重写变量名:String,
重写变量作业:字符串
):A,B
D类{
fun getList():E=E(
阿雷利斯托夫(
C(“用户1”、“作业1”),
C(“用户2”、“作业2”),
C(“用户3”、“作业3”)
)
)
}
E类(val列表:列表),其中T:A,T:B{
趣味展示(){
//因为(我在1..10中)会抛弃边界外的感觉
list.forEach{
println(“我的名字是${it.name},我是${it.job}”)
}
}
}
//检验
趣味主线(args:Array){
D().getList().display()
/*威尔印刷品
我的名字是user1,我是job1
我的名字是user2,我是job2
我的名字是user3,我是job3*/
}

对@Scrobot给出的答案进行了一些扩展

简而言之,你不能做你想做的事。当您指定
List
作为类型时,您将省略关于列表中的元素是否实现接口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:A{
重写变量名:String
}
val list:list=arrayListOf(
C(“用户1”、“作业”),
PureA(“用户2”)
)
//下面这行行不通,理由很充分
//E(名单)
如果最后一行起作用,你基本上会破坏你的代码。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)
    }
}
//无法完全工作
D类,其中T:A,T:B{
private fun getList():E{
val list:list=arrayListOf(
C(“用户1”、“作业1”),
C(“用户2”、“作业2”),
C(“用户3”、“作业3”)
)
E(名单)
}
}
我看不出一个完整的方法来确定你该做什么。我假设您希望允许将来的类也实现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
    }
}
接口AB:A、B
C类(
重写变量名:String,
重写变量作业:字符串
):AB
D类{
私人娱乐清单(){
val list:list=arrayListOf(
C(“用户1”、“作业1”),
C(“用户2”、“作业2”),
C(“用户3”、“作业3”)
)
E(名单)
//我想在这里初始化我的构造函数
}
}

这是一个非常好的解决方案,尽管它能给你带来更多的乐趣。但这通常是非常好的:)

谢谢你的回答,很抱歉出现了循环。你所修复的是正确的,但这不是我的问题。我想在D类中调用E类,但我不知道如何将列表作为参数传递!您无法将
List
作为参数传递,因为您的
t
应该实现接口
A
B
。这只是你的班级
C
。但是您可以在
val list:list=arrayListOf()
中初始化接口
a
的列表。将其更改为
List
,然后您可以使用List参数调用E构造函数
E(List)
如果我有许多实现A和B的类,就像Chow一样,我可以将它们放在列表中吗?这意味着您应该将class
C
更改为抽象类。然后你可以用
C
扩展一些其他类,并制作
List
你能给我解释一下在我的例子中,我的E类构造函数是什么样的吗?