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一样,我可以将它们放在列表中吗?这意味着您应该将classC
更改为抽象类。然后你可以用C
扩展一些其他类,并制作List
你能给我解释一下在我的例子中,我的E类构造函数是什么样的吗?