【问题标题】:Any generic in KotlinKotlin 中的任何泛型
【发布时间】:2023-03-11 19:23:01
【问题描述】:

现在我正在学习 Kotlin,我有一个问题。我正在编写下面的代码,我收到错误“整数文字不符合预期的字符串类型”。

fun main() {

fun <Any> MutableList<Any>.yaz(name : Any) : Any = name;

var mutableList : MutableList<String> = ArrayList<String>()

println(mutableList.yaz(1))
println(mutableList.yaz("Selam"))

}

我在哪里犯了错误?如果您能提供帮助,我将非常高兴。谢谢!

当我写如下时它可以工作,但我不明白为什么。

fun <Any> MutableList<out Any>.yaz(name : Any) : Any = name;

【问题讨论】:

  • 您是否打算将Any 表示通常的类型kotlin.Any?因为它不是:通过指定&lt;Any&gt;,它只是yaz() 定义中的类型参数的名称。 (这就是为什么我们通常使用单个字母作为类型参数,以避免这种混淆。)
  • 有什么区别? @gidds

标签: kotlin generics


【解决方案1】:

正如@gidds 在 cmets 中所说,您可能正在编写 Any 来表示 Kotlin 中的 Any 类型,但是由于您已将 Any 指定为函数 yaz 的泛型,因此它不再是表示一个具体化的类型。

明确地,

fun <Any> MutableList<Any>.yaz(name : Any) : Any = name;

等价于

fun <T> MutableList<T>.yaz(name : T) : T = name;

因此,您的示例无法编译的原因是因为您指定MutableList 的类型应与name 参数的类型相同,而使用MutableList&lt;String&gt; 时则不正确和name = 1


Koltin 中的out 参数将某物声明为生产者,但有一个非常详细的解释here 会比我能解释得更好。但是,您使用 out 的示例工作正常这一事实对我来说是个谜,所以如果有人能解决这个问题会很好。

【讨论】:

  • 经过几个小时的研究,我意识到我的错误,您的评论也很有用。谢谢。
  • 太棒了!我仍然不知道为什么添加out 可以让它编译,所以如果你发现了,请告诉我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多