Kotlin中任何类型和泛型之间的差异

Kotlin中任何类型和泛型之间的差异,kotlin,Kotlin,假设我有下面的函数定义 fun<T> parse(a: Any): T = when (a) { is String -> a else -> false } fun parse(a:Any):T=when(a){ 是字符串->a吗 else->false } 我猜它应该是有效的。但是,IntelliJ IDEA linter显示了一个类型不匹配错误 也就是说,我会将解析函数的返回类型更改为Any,对吗?那么,在Kotlin中使用任何类型和泛型有什么

假设我有下面的函数定义

fun<T> parse(a: Any): T = when (a) {
    is String -> a
    else -> false
}
fun parse(a:Any):T=when(a){
是字符串->a吗
else->false
}
我猜它应该是有效的。但是,IntelliJ IDEA linter显示了一个类型不匹配错误

也就是说,我会将解析函数的返回类型更改为Any,对吗?那么,在Kotlin中使用任何类型和泛型有什么区别?在哪些情况下应使用这些选项


我确实读过以下内容,但由于我是一个新手,我对科特林的恒星投影一无所知。

您的返回类型定义为
T
,但无法保证
T
a:Any
是相关的
T
可能比
Any
更具限制性,在这种情况下,您不能返回布尔值或为
a
提供的任何值

通过将返回类型从
T
更改为
Any
,以下操作将起作用:

fun<T> parse(a: Any): Any = when (a) {
    is String -> a
    else -> false
}
fun parse(a:Any):Any=when(a){
是字符串->a吗
else->false
}
如果您确实希望返回类型T,则可以选择任何其他选项:

inline fun<reified T> parse(a: Any): T? = when (a) {
    is T -> a
    else -> null
}
inline fun parse(a:Any):T?=何时(a){
T->a吗
else->null
}

您的示例没有使用
T
,因此,无论如何,将其变为通用是毫无意义的

考虑一下:作为一个客户端,您将一些东西放入函数中,例如XML-
ByteArray
,函数应该将其解析为
对象。调用函数时,您不希望它返回
Any
(Casting-sucks),而是希望函数返回已解析对象的类型。这可以通过泛型实现:

fun <T> parse(xml: ByteArray): T {
     val ctx: JAXBContext = JAXBContext.newInstance()
     val any = ctx.createUnmarshaller().unmarshal(ByteArrayInputStream(xml))
     return any as T
}

val int = parse<Int>("123".toByteArray())
val string = parse<String>("123".toByteArray())
fun解析(xml:ByteArray):T{
val ctx:JAXBContext=JAXBContext.newInstance()
val any=ctx.createUnmarshaller().unmarshal(ByteArrayInputStream(xml))
以T的形式返回任何
}
val int=parse(“123”.toByteArray())
val string=parse(“123”.toByteArray())
看看方法调用:您可以用泛型告诉您期望返回的类型。这段代码没有用,只是想让您了解泛型

我猜它应该是有效的

为什么会这样?在一个分支中返回
字符串
,在另一个分支中返回
布尔值。因此,当
表达式为
Any
时,整个
的通用类型就是编译器(和IDEA)所说的“found”。您的代码还说它应该是
T
(这是“必需的”)

您的通用方法应该适用于任何
T
,例如
Int
,但是
any
不是
Int
的子类型,因此代码无效

那么,在Kotlin中使用任何类型和泛型有什么区别


这就像问“使用数字和文件有什么区别”:它们一开始并没有太多共同之处。您可以使用泛型编写代码,这些代码可以处理所有类型
T
(或者处理满足某些约束的所有类型);当您需要特定类型的
Any
时,您可以使用
Any

这个Java答案可能会帮助您找到答案吗?是否有一个很好的例子说明如何将
Any
T
一起使用?或者在Kotlin中泛型是完全可选的